EclipseLink JPA : L2 Cache Stratejileri
JPA (Java Persistence API) standardının referans uygulayıcı kütüphanesi olan EclipseLink 2. seviye cache mekanizmasını (shared cache de denebilir) varsayılan olarak sağlamaktadır. 1. seviye cache ise EntityManager tarafından yönetimli halde bulunan entity nesneleri oluşturmaktadır.
Veritabanına persist edilen ve okunan herbir entity kaydı varsayılan olarak 2. seviye cache alanına aktarılırlar. Bu sayede tekrar eden entity istekleri öncelikli olarak bu 2. önbellek alanına bakılarak kontrol edilir, nesne burada varsa veritabanına uğramadan istek bu özel alandan karşılanır.
Olağan entity kayıtları gibi veritabanından JPQL sorgularıyla elde edilen kayıt(lar) da 2. seviye cache alanında tutulurlar.
EntityManager tarafından anabellekte bulundurulan entity nesnelerinin ömrü, ait olduğu EntityManager nesnesine ait Transaction sonlandıktan sonra bitebilir ve bu nesneler farklı EntityManager instance’ ları tarafından paylaşılabilir değildir.
Oysa 2. seviye önbellek alanında bulunan entity nesneleri, ait olduğu ortam (EntityManagerFactory veya Server) içinde tüm kullanıcılar için paylaşımlı olarak kullanılırlar. Bu sebeple zaten L2 cache’ e “shared cache” de denmektedir.
https://blogs.oracle.com/carolmcdonald/entry/jpa_cachingOlağan cache mekanizmalarında olduğu gibi, EclipseLink kütüphanesinin sağladığı cache mekanizmasında da, cache ortamında tutulacak nesnelerin sayısı, ne kadar süre yaşayacağı (expire time), cache strateji tipi gibi bilgiler yapılandırılabilir haldedir.
Bu yapılandırmalar entity sınıfı bazında ya da genel olarak tüm entity nesneleri üzerine hakim olur şekilde persisten.xml konfigürasyon dosyasında yapılabilir.
EclipseLink için paylaşımlı L2 cache konfigürasyonu şu şekildedir.
Özellik | Açıklama | Varsayılan |
type | Cache strateji tipini tanımlar | CacheType.SOFT_WEAK |
size | Cache alanı başlangıç boyutu | 100 |
shared | L2 cache aktive-deactive etme | true |
expiry | Entity nesnesinin ömrü | -1 ( ölümsüz : ) |
Dahası için >> |
Şimdi bu tabloda yer alan özellikleri tek tek açıklamaya çalışalım.
type: 2. seviye cache için kullanılacak stratejiyi belirler. CacheType sınıfının içinde yer alan statik alanlarla tanımlanırlar. Bu alanlar;
- CacheType.Full : Uygulama tarafından okunan tüm entity nesneleri bu alanda saklanır. 2. seviye cache ile başlangıç boyutu tanımlanabilmesine karşın, azami boyut seçilememektedir. Bu cache stratejisinin özelliği cache alanında bulunan entity nesneleri kesinlikle Çöp toplayıcı tarafından bellekten temizlenmezler. Büyük boyutlu entity nesneleri için bu özellik bir tehdit oluşturur. Fakat ufak boyutlu, belirli sayıda ve bellek alanını tehdit etmeyecek nesneler için bu strateji kullanılabilir.
- CacheType.HardWeak : HardWeak stratejisinde üzerinde sık işlem yapılan entity nesneleri (Most Recantly Used) sabit boyutlu özel bir alanda saklanırlar ve bu alana Çöp toplayıcı müdahale etmez. Genel cache alanına ise Çöp toplayıcı istediği zaman müdahale edebilir haldedir.
- CacheType.NONE : Shared cache devre dışı bırakır.
- CacheType.Soft : Uygulama tarafından okunan tüm entity nesneleri 2. seviye önbellekte tutulurlar. Herhangi bir referansa bağlı olmayan nesneler, JVM kullanılabilir bellek alanı azaldığında Garbage Collector tarafından temizlenir.
- CacheType.SoftWeak : SoftWeak stratejisinde üzerinde sık işlem yapılan entity nesneleri (Most Recantly Used) sabit boyutlu özel bir alanda saklanırlar ve bu alana Çöp toplayıcı bellek boyutu azaldığında müdahale edebilir. Genel cache alanına ise Çöp toplayıcı istediği zaman müdahale edebilir.
- CacheType.Weak : Uygulama tarafından okunan tüm entity nesneleri cache alanında saklanır. Fakat tüm entity nesneleri Çöp toplayıcının elinin altındadır. Çöp toplayıcı bellek bakımından strese düşmeden de bu nesneleri yok edebilir.
size : Paylaşımlı cache alanının varsayılan başlangıç boyutu 100’dür ve bu sınır aşıldığında cache boyutu iki katına yükseltilir.
shared : true ise shared cache kullanılır, false ise her bir kullanıcı için izole edilmiş bir cache alanı yapılandırır. Yani false değeri L2 cache’i devredışı bırakır.
expiry : Cache alanında tutulan entity nesnesinin ömrünü tanımlar. Varsayılan olarak expire olma süresi -1’dir (süresiz). Bu özellik milisaniye türevinden bir değerle yapılandırılabilir.
Yapılandırma örnekleri
Daha önce de belirtildiği üzere L2 cache yapılandırmaları persistence.xml yapılandırma dosyasında veya çeşitli notasyon tanımlayıcıylarıyla yapılabilmektedir. Aşağıda persistence.xml içinde yapılan örnek bir yapılandırma bulunmaktadır.
<persistence-unit name="L2Cache_PU" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>com.usta.Musteri</class> <class>com.usta.Siparis</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/l2db"/> <property name="javax.persistence.jdbc.password" value="root"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="eclipselink.ddl-generation" value="create-tables"/> <property name="eclipselink.cache.type.default" value="SoftWeak"/> <property name="eclipselink.cache.shared.default" value="true"/> <property name="eclipselink.cache.size.default" value="500"/> </properties> </persistence-unit>
Varsayılan olarak persistence-unit bileşeni içine eklenmiş entity sınıfları L2 cache ortamında tutulurlar. Eğer bir entity nesnesinin L2 cache ortamında bulundurulması istenmiyorsa @Cacheable notasyonu size yardımcı olabilir.
@Entity @Cacheable(false) public class Musteri implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; ... ... }
Entity sınıfı bazında L2 cache yapılandırması için ise @Cache notasyonu kullanılabilir.
@Entity @Cache(isolation= CacheIsolationType.SHARED, type= CacheType.FULL, expiry=10000, size=300 ) public class Musteri implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; ... ... }
Görüşmek dileğiyle..
Tag:eclipselink, jpa, L2 cache