• Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim
KodEdu
  • Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim

JSR 107 – JCache Standardına İlk Bakış

  • Posted by Kodedu
  • Categories backend, Genel, Uncategorized, Yazılım
  • Date 17 Eylül 2014

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.

JSR107 – JCache Bağımlılığı
<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.

JSR107 – JCache RI (Referans Uygulayıcı)
<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)

...
  1. CachingProvider nesnesi elde ediliyor.
  2. CacheManager nesnesi elde ediliyor.
  3. MutableConfiguration nesnesi oluşturuluyor.
  4. Key ve Value tipleri tanımlanıyor.
  5. Geçicilik politikası belirleniyor.
  6. 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)
  1. Key: İstanbul Value:*34* torbaya ekleniyor
  2. Key: Antalya Value:*07* torbaya ekleniyor
  3. Key: İstanbul yok ise ekliyor. Yani eklemiyor.
  4. Birden fazlasını Key → Value çifti ekliyor.
  5. Var olan değeri değiştiriyor.
  6. Var olan plaka numarasını döndürüyor.
  7. Var olan kaydı siliyor.
  8. 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 ***");
...
  1. Cache içeriği çıktılanıyor
  2. 1 dakika bekletiliyor. (Expiry süresini aşma için)
  3. Cache içeriği tekrardan çıktılanıyor.
Çıktı
*** 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.

Örnek Uygulama

Tekrar görüşmek dileğiyle.

Tag:backend

  • Share:
author avatar
Kodedu

Previous post

JPA 2.1 Entity Graph
17 Eylül 2014

Next post

JCache - CacheLoader ve CacheWriter Kullanmak
19 Eylül 2014

You may also like

api-logo
Swagger Nedir? Neden kullanılır?
10 Ekim, 2018
spring-cli-logo
Spring CLI ile Spring Boot Projeleri Hazırlamak
21 Ağustos, 2017
eureka_architecture
Spring Cloud Netflix ve Eureka Service Discovery
3 Temmuz, 2017

    1 Comment

Leave A Reply Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta listesine kayıt olun!






Gözde yazılar

Sürekli Entegrasyon Yaklaşımları – (ücretsiz webiner)
16Tem2012
Java API for JSON Processing – Creating JSON Objects
15Haz2013
EclipseLink JPA : L2 Cache Stratejileri
10Eki2012
Cloud Jenkins (BuildHive)
18May2012

Son Yazılar

  • Java’da Record’lar 27 Ocak 2020
  • Swagger Nedir? Neden kullanılır? 10 Ekim 2018
  • Spring CLI ile Spring Boot Projeleri Hazırlamak 21 Ağustos 2017
  • Spring Cloud Netflix ve Eureka Service Discovery 3 Temmuz 2017
  • Online React.js Eğitimi ardından (15-25 Mayıs 2017) 31 Mayıs 2017

Son Yorumlar

  • Coupling ve Cohesion Kavramları Nedir? için Hilal
  • Naïve Bayes Sınıflandırma Algoritması için Rahman Usta
  • Naïve Bayes Sınıflandırma Algoritması için Mete
  • YAML Nedir? Neden YAML Kullanmalıyız? için kara
  • JWT (JSON Web Tokens) Nedir? Ne işe yarar? için Furkan

Get Java Software

Arşivler

Bizi takip edin

React.js Eğitimi Başlıyor
11-22 Eylül, 2017
Eğitmen
Rahman Usta
İletişim

merhaba@kodedu.com

  • Hakkında
  • Gizlilik Politikası
  • İletişim
  • Referanslar
Kodedu Bilişim Danışmanlık
Cemil Meriç mah. Çelebi sok.
No:16/3 Ümraniye/İSTANBUL
Tel: 0850 885 38 65
Alemdağ V.D.: 8960484815

KODEDU © Tüm hakları saklıdır.