JSR 107 – JCache Standardına İlk Bakış
JCache (Java Temporary Caching API), bir sonraki Java EE sürümünde (Java EE 8
) yer alması beklenen bir Java EE standardıdır. (Bkz. JSR-107)
JCache başlangıçta Java EE 7 ile birlikte çıkması planlanırken, yetiştirilememesinden ötürü Java EE 7 içerisinde yer almadı. Fakat standartlaştırma süreci 18 Mart 2014’de tamamlandığı için Java EE 8 içerisinde yer alması kuvvetle ihtimal olarak gözüküyor.
JCache, geçici süre bellekte tutulan verilerin yönetilmesi amacıyla oluşturulan bir Java standardıdır. Amacı ise her standartta olduğu gibi, kendi alanında yer alan Cache sağlayıcılarına ortak bir yapı sunmaktır. JCache bu ortak yapıyı, javax.cache.**
paketi altındaki çeşitli arayüz, sınıf ve notasyonlar ile sunmaktadır. Cache sağlayıcıları ise, bu arayüzlere dönük implementasyonlarını oluşturmaktadır.
Başlangıç
JCache kullanmaya başlamak için JCache standardında bulunan arayüz ve notasyonların bulunduğu JAR
bağımlılığının projeniz içerisinde yer alması gerekmektedir. Bu bağımlılığa buradan veya aşağıdaki Maven dependency
elemanı ile elde edebilirsiniz.
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.0.0</version>
</dependency>
JSR107 – JCache Bağımlılığı‘nda sadece standarda dayalı API’ler yer almaktadır. Bu API’ye ek olarak kendimize bir de Cache Provider seçmeliyiz.
JSR107 için RI (Reference Implementation) kütüphanesi seçilebileceği gibi, diğer JSR 107 uygulayıcıları da kullanılabilir.
Hazelcast projesinin de JCache için çalışmalarını sürdürdüğünü gözlemliyorum. Hatta bununla ilgili birkaç Webinar kayıtları da bulunuyor (Bkz. Hazelcast JCache ). EhCache ve Coherence projelerinin de şu anda JCache standardını desteklediğiniz söyleyebiliriz.
JSR107 kullanmaya aşağıdaki referans uygulayıcı kütüphaneyle veya diğer sağlayıcıların sunduğu kütüphaneler ile başlayabiliriz.
<dependency>
<groupId>org.jsr107.ri</groupId>
<artifactId>cache-ri-impl</artifactId>
<version>1.0.0</version>
</dependency>
JCache Bileşenleri
JCache cache-api
bağımlılığı, geliştiricilere belli başlı arayüzler sunmaktadır. Bunların başlıcaları şöyledir;
- CachingProvider
- Cache sağlayıcısını temsil eden bir arayüzdür.
- CacheManager
- Cache nesnelerini yöneten özel bir arayüzdür.
- Cache
- Map benzeri bir veri yapısı sunan arayüzdür.
- Configuration
- Cache nesnelerini yapılandırmak için kullanılan bir arayüzdür.
JCache ve Geçicilik
JCache (Java Temporary Caching API) adı üzerinde geçici olarak depolanacak verilerin yönetiminden sorumlu bir standarttır. Cache nesnelerinde depolanan verilerin ne kadar süre bellekte bulunacağı ise geçicilik politikası (expiry policy) ile ilgili bir durumdur.
JCache ile önbellekte tutulan verilerin ne zaman yok olacağı, süre bazlı olarak geliştiri tarafından belirlenebilmektedir. Bir Cache nesnesinin barındırdığı verilerin ne zaman erişilemez olacağı ExpiryPolicy
türünden nesnelerle belirlenmektedir.
- AccessedExpiryPolicy
- Cache nesnesine erişimden t süre sonra Cache içeriği yok olur.
- CreatedExpiryPolicy
- Cache nesnesi oluşturulduktan t süre sonra Cache içeriği yok olur.
- EternalExpiryPolicy
- Cache nesnesi içeriği geçicilik dışı kalır. İçerik expiry olmaz.
- ModifiedExpiryPolicy
- Cache içeriği düzenlendikten (ekleme, güncelleme) t süre sonra Cache içeriği yok olur.
- TouchedExpiryPolicy
- Cache içeriğine dokunuştan (silme, ekleme, güncelleme) t süre sonra Cache içeriği yok olur.
Uygulama Zamanı
JCache kullanabilmek için CacheManager#createCache
metodu kullanılmaktadır. Elde edilen Cache nesnesi Map
arayüzüne oldukça benzemektedir. Cache
nesneleri içerisinde tutacağı verileri Key ⇒ Value biçiminde tutmaktadır.
CachingProvider cachingProvider = Caching.getCachingProvider(); (1)
CacheManager cacheManager = cachingProvider.getCacheManager(); (2)
MutableConfiguration config = new MutableConfiguration(); (3)
config.setTypes(String.class, Integer.class); (4)
config.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(Duration.ONE_MINUTE)); (5)
Cache<String, Integer> kodcu;
kodcu = cacheManager.createCache("kodcu", config); (6)
...
CachingProvider
nesnesi elde ediliyor.CacheManager
nesnesi elde ediliyor.MutableConfiguration
nesnesi oluşturuluyor.Key
veValue
tipleri tanımlanıyor.- Geçicilik politikası belirleniyor.
config
nesnesiyle beraber"kodcu"
isimli Cache nesnesi oluşturuluyor.
Yukarıda listeli 6 adımda eşsiz bir kodcu isimli Cache nesnesi üretilmiş olmaktadır. Bu adımdan sonra Cache nesnesine, ekleme, silme, güncelleme gibi işlemler bu nesne üzerinden yapılabilmektedir.
Cache<String, Integer> kodcu = // ...
kodcu.put("İstanbul", 34); (1)
kodcu.put("Antalya",07); (2)
kodcu.putIfAbsent("İstanbul", 99); (3)
kodcu.putAll(new HashMap<String, Integer>() { (4)
{
put("Ankara", 07);
put("Kayseri", 38);
}
});
kodcu.replace("Ankara",06); (5)
Integer kayseri = kodcu.get("Kayseri"); (6)
boolean silindiMi = kodcu.remove("Ankara"); (7)
Integer antalya = kodcu.getAndRemove("Antalya"); (8)
Key
: İstanbulValue
:*34* torbaya ekleniyorKey
: AntalyaValue
:*07* torbaya ekleniyorKey
: İstanbul yok ise ekliyor. Yani eklemiyor.- Birden fazlasını Key → Value çifti ekliyor.
- Var olan değeri değiştiriyor.
- Var olan plaka numarasını döndürüyor.
- Var olan kaydı siliyor.
- Var olan kaydı önce getiriyor, ardından siliyor.
Yukarıda işletilen 8 adım ile ekleme, silme ve değiştirme işlemleri yapılmaktadır. Bu işlemler sonucunda torbada aşağıdaki elemanlar yer alacaktır.
Key | Value |
---|---|
İstanbul |
34 |
Kayseri |
38 |
Cache içerisindeki tüm verileri iterasyon ile elde edebilirsiniz. Çünkü Cache arayüzü aynı zamanda Iterable arayüzü türündendir.
...
System.out.println("*** Cache print started ***");
for (Cache.Entry<String, Integer> entry : kodcu) { (1)
String key = entry.getKey();
Integer value = entry.getValue();
System.out.format("Key: %s - Value: %d %n", key, value);
}
System.out.println("*** Cache print end ***");
Thread.sleep(1000 * 60); // Dikkat (2)
System.out.println("*** Cache print started (after one minute) ***");
for (Cache.Entry<String, Integer> entry : kodcu) { (3)
String key = entry.getKey();
Integer value = entry.getValue();
System.out.format("Key: %s - Value: %d %n", key, value);
}
System.out.println("*** Cache print end ***");
...
- Cache içeriği çıktılanıyor
- 1 dakika bekletiliyor. (Expiry süresini aşma için)
- Cache içeriği tekrardan çıktılanıyor.
*** Cache print started *** Key: Kayseri - Value: 38 Key: İstanbul - Value: 34 *** Cache print end *** // 1 dakika sonra *** Cache print started (after one minute) *** *** Cache print end ***
Yukarıdaki çıktıda görüldüğü üzere expiry süreci 1 dakika olarak belirtildiğinden ötürü 1 dakika sonra Cache içeriği sıfırlanmış oldu.
Şimdilik bu kadar. Örnek uygulamaya aşağıdaki bağlantıdan erişebilirsiniz.
Tekrar görüşmek dileğiyle.
Tag:backend
1 Comment