Hibernate and Application Performance

 hibernate 2 cur cache memory var:

L1(Level bir) burada entitymanager a aiddir. bazadan gelen entityler cacheda saxlanir ve her entitymanagere xasdir

L2(level 2) burada ise umumiyyetle EntityManagerFactory ye xidmet eden entiymanagerler arasinda shared cache memorydir ve level 1 den daha uzun muddetlidir

level 2 cache i aktivleshdirmek uchun dependency elave edilir projecte ve 1-2 config edilir

Javada 4 cur reference type var :

https://dzone.com/articles/reference-types-java-part-1

  1. Strong references.
  2. Soft references.
  3. Weak references.
  4. Phantom references

entitymanager de weak referance var , ve o strongla muqayisede GC terefinden istenilen an siline biler ram lazim olsa.

soft referance - strongdan zeif , weakdan gucludur ve GC onu ancaq en vacib hallarda sile biler, weak i her memory chatmiyanda sile biler ama softu ancaq outofmemory alacagi teqdirde silib ishlede biler ve soft un omru uzun olur . ve Level 2 cache da istifade edir bunu hibernate. burda da bele shey varki , LRU(last recently used) yeniki mueyyen say qeder cache saxliyir ondan artiqnin saxlamir ve her yeni cache gelende konhe silinir uzaqda olan

numune :

Student student = new Student();

SoftReference softReference = new SoftReference(student);

student = null;

softReference.get();

burada gorunduyu kimi ilk setir strong reference a aiddir , 2 ci ise soft a. burada strong reference null olan kimi GC onu silecek . amma soft a bu tesir etmeyecek taaki jvm outofmemeory vermiyene qeder

Student student = new Student();

WeakReference weakReference = new WeakReference(student);

student = null;

weakReference.get();

ancaq bu case da , strong referencein null olmasi , weak a tesir ede biler ve GC gorseki memeorye ehtiyac var onu istediyi an sile biler

ama bunlarin hech biri zemanet vermirki student objecti qayida biler, chunki arxada GC lazim olanda reference i sile biler ve null qayidar

hibernate ise bunlari cache uchun istifade edir ve eger null qayitsa basha dushurki bazaya sorgu verib yeniden load etmek lazimdir

PhantomReference biraz ferqli ishleyir , demeli deyekki video load olub jvm e ve olchusu boyukdur 2 ci vidoe yukelnse OutOfMemory ala bilerik . ama ramda yer var mueyyen qeder bu ise 2 ci videoya kifayet elemir ve GC da bosh yeri gorub ishlemir , bu case da biz bu emelyati PhantomReference ile ede bilerik ve bu GC uchun trigger rolu oynayacaq . ne vaxtki video process olub qutarir GC ni trigger edirler ve o lazimsiz yeri silir


@Transactional annotation:

method levelde istifade olunur  , ve ilk db emelyati bashliyandan son db emelyati qutarana qeder transaction achiq qalir  , tutaqki 2 entity dalbadal bazaya save olmalidi amma 1 ci save olunur 2 ci save olunmur hansisa sebebden, bu case da exception olur ve try catchda tutulur onda rollback edir ve hec bir data bazaya yazilmir(bu prosesler arxada bash verir) eger her 2 si success dise onda ok transaction commit olur ve emelyat sona chatir

Diqqet!!! eger @Transactional istifade olunmasa onda bu rollback emelyati olmyacaq ve db de qarishiq vezyet yaranacaq(1 ci save olunacacaq, 2 ci yox)

Diqqet!!! amma bu annotation un ishlemesi uchun bezi shertler var:

gerek method public olsun ve servisin methodunu bashqa yerden chagirsinlar (her 2 shert odenmelidir!)

sebebi odurki , transaction meselesi proxy uzerinden gedir (spring de dependency injection meselesi ile elaqedar) ve bashqa clasdan cchagrilish olanda bu proxy istifade olunur spring terefinden , amma eyni class daxili chagrilish olanda proxy istifade olunmur ve neticede springin o methodun chagrilmagindan xeberi olmur

Transaction haqqinda maraqli caselar:

https://codete.com/blog/5-common-spring-transactional-pitfalls/


Rollback la bagli maraqli meqam :

@Transactional ancaq unchecked exception halinda rollback edir emelyati , eger checked exception olsa etmir





Comments

  1. Transactional annotation u uchun rahat izah tapa bilmemishdim ve ya chox axtarmamishdim indiye kimi :D teshekkurler !

    ReplyDelete
  2. Kicik bir melumatda men elave edim:
    Spring’in @Transactional management -i AOP (Aspect-Oriented Programming) və Proxy mexanizmi ilə işləyir. Ancaq eyni class içində bir method, başqa bir methoda birbaşa müraciyyət edərsə, Spring’in Proxy mexanizması işə düşməz və @Transactional işləməz!
    Bura da ən vacib məqam budur.Əgər firstMethod() içində birbaşa secondMethod() çağrılırsa, Spring proxy istifadə etməz.
    Çünki Spring’in @Transactional mexanizması yalnız fərqli Spring Bean vasitəsilə edilən çağrıları proxy tərəfindən idarə edir.Bir sözlə desək secondMethod() methodu, fərqli bir Bean üzərindən çağrılmadığı üçün Spring Proxy işə düşməz və yeni bir Transaction açılmaz!

    ReplyDelete

Post a Comment

Popular posts from this blog

Installation instructions for some programs on linux ubuntu

Java Date and Time examples