EclipseLink Java Persistence API (JPA) Cache Yönetimi

Batuhan Düzgün tarafından yayınlanmıştır 10. October 2012 09:57

EclipseLink Java Persistence API  (JPA)  Cache Yönetimi

Merhaba arkadaşlar bu yazıda sizlerle birlikte EclipseLink JPA framework üzerinde Cache yönetimine giriş yapacağız. Her ORM aracı gibi EclipseLink'de veritabanı işlemleri ve veri sorgulamaya dair bir katmandır. EclipseLink JPA, Oracle firması tarafından Open Source dünyasına armağan edilmiş açık kaynak kodlu bir framework'tür. Şuan bu ürünün geliştirilmesi Eclipse Community'e bağlı Java geliştirici tarafından ilerletilmektedir. Her sürümü ve versiyonu tamamen açık kaynak kodludur.

EclipseLink JPA Yararları

1-) EclipseLink JPA ile veritabanları ile uygulama yazılımları arasında esneklik ve izolasyon sağlanır.

2-) Cache sistemiyle her işlem için veritabanına sürekli gidip sorgulama yapılmaz. Böylece hız kazancı sağlar.

3-) JPQL ve Criteria API 'leriyle birlikte SQL bağımsız bir yapı geliştirmenizi ve veritabanı yönetim sistemleri arasında uygulamanızı taşımanızı kolaylaştırır. Örneğin: Oracle'dan MySQL veritabanı yönetim sistemine geçişte hiçbir problem yaşanılmaz ve diğer bir çok veritabanı ile de.

4-) Veri modelinizi nesne yönelimli yaklaşım ile modelleyip veritabanı tarafına yansıtabilirsiniz. Böylece nesne yönelimli yaklaşıma dair kazanımlardan ve avamtajlardan yararlanabilirsiniz.

5-)  İşletilmesi istenilen SQL cümleleri biriktirilir ve topluca işletilir.

6-) EclipseLink JPA ile birden fazla veritabanına veya şemaya bağlanma imkanı mevcuttur.

EclipseLink JPA Cache Sistemi

Cache sistemi ve veritabanı ile çalışmada performans kazancı sağlanır. Çünkü, bir kere cache'e alınmış olan kayıt listesi bilgisayar hafızasında  tutulur. Böylece, herhangi bir kayıt sorgulanmak istendiğinde varsa cache üzerinden alınıp verilir. Böylece, hız ve performans kazancı sağlanmış olunur. EclipseLink JPA ile cache sistemi kurulur ve “EntityManagerFactory” üzerinde tutulur, belli bir tabloya ait tüm kayıtlar, belli bir tabloya ait sadece bir kayıt veya bütünüyle tüm kayıtlar cache'den temizlenebilir.

EclipseLink JPA Projesi Hazırlamak ?

EclipseLink JPA projesi hazırlamak için aşağıdaki JAR dosyaları projeye eklenir. Yani, projenin Build Path' ine eklenir.  Ayrıca, veritabanı bağlantı tanımları için  “persistence.xml”  dosyası tanımlanır. Bu dosya yine Java Projesinde yer META-INF klasöründe bulunmalıdır. Ayrıca, web projeleri için bu XML dosyası herhangi bir Build Path altında bulunan META-INF klasörüne yerleştirilmelidir. Örneğin:  varsayılan olarak açılan web projesinde “src” klasörü projenin Build Path'idir.

Eklenmesi gereken JAR Dosyaları

-        javax.persistence.jar

-        eclipselink.jar

Eclipse IDE'sini açarak yeni bir Java projesi oluşturulur. Ardından aşağıdaki gibi bir “pesistence.xml” isminde boş bir XML dosyası eklenir. İçeriği aşağıdaki gibi doldurulur.

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

       <persistence-unit name="Test.development.mysql" transaction-type="RESOURCE_LOCAL">

             <!-- PersistenceUnit içinde yer alacak olan tablolara ait Entity Sınıflar yazılır -->

             <class>com.Sample2</class>

             <class>com.Sample1</class>         

             <!-- Veritabanı bağlantısı için gerekli olan parametreler -->

             <properties>

                    <!-- MySQL veritabanı bağlantı URL -->

                    <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test"/>

                    <!-- Veritabanına bağlanacak olan Username ve Password bilgileri -->

                    <property name="javax.persistence.jdbc.password" value=""/>

                    <property name="javax.persistence.jdbc.user" value=""/>

                    <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>

                    <!-- Tablo işlemleri için mod seçilir. -->

                    <!--

                           create-tables : Yukarıda belirtilen sınıflara karşılık veritabanı tarafında bir tablo yok ise yaratılır.

                           none : Tablo yaratılmasını engeller. Herhangi bir tablo yaratma veya değiştirme işlemi yapılmaz.

                           drop-and-create-tables : Varolan tabloları drop eder ve yeniden create eder.

                     -->

                    <property name="eclipselink.ddl-generation" value="create-tables" /> <!-- none / create-tables / drop-and-create-tables -->

                    <property name="eclipselink.ddl-generation.output-mode" value="database" />

                    <!-- Console ekranında işletilmiş olan SQL cümleleri loglanır ve gösterilir. -->

             <property name="eclipselink.logging.level.sql" value="FINE"/>

                    <property name="eclipselink.logging.parameters" value="true"/>

             </properties>

       </persistence-unit>

</persistence>

Yukarıda gerekli açıklamalar verilmiştir. Bunun dışında bir çok parametre bulunmaktadır.

@SuppressWarnings("serial")

// Entity etiketi ile birlikte hazırlanmış olan sınıfın veritabanı tarafında bir tablo olarak yaratılacağı belirtilir.

@Entity

// Veritabanı tablosunun ismi ve bulunduğu veritabanı ismi belirtilir.

@Table(name="Sample1", schema="test")

public class Sample1 implements Serializable{

       // Id etiketiyle birlikte bu değişkenin primary key alanı olacağı belirtilir.

       @Id

       // GeneratedValue etiketi ile birlikte primary key olan alanın artış değeri ve sequence'i verilir.

       // IDENTITY ile primary key alanın birer birer artacağını temsil edilir.

       @GeneratedValue(strategy=GenerationType.AUTO)

       // Column etiketi ile birlikte sütuna ait gerekli ayarlamalar yapılabilir.

       @Column(name="id")

       private long id;

       @Column(name="name")

       private String name;

       @Column(name="age")

       private int age;

       public long getId() {

             return id;

       }

       public void setId(long id) {

             this.id = id;

       }

       public String getName() {

             return name;

       }

       public void setName(String name) {

             this.name = name;

       }

       public int getAge() {

             return age;

       }

       public void setAge(int age) {

             this.age = age;

       }

}

Yukarıda hazırlanmış olan sınıf persistence.xml 'de class tanımı olarak yazılır. Böylece çalıştırıldığında “Sample1” adında bir tablo yok ise yaratılmış olunur.

“Sample1” tablosuna bir çok kayıt girildiğini düşünelim ve bunları EntityManagerFactory'e cache'lendiğini düşünelim. Cache'de yer alan tüm kayıtları silmek için aşağıdaki kod bloğu çalıştırılabilir.

rm2.getEntityManagerFactory().getCache().evictAll();

 

EntityManagerFactory üzerinden sadece belli bir tabloya ait kayıtları tamamen silmek için aşağıdaki gibi bir komut işletilmelidir. Böylece Cache'de o tabloya ait yer alan tüm nesneler, EntityManagerFactory içinden silinecektir.

EntityManagerFactory factory2 = Persistence.createEntityManagerFactory("Test.development.mysql");

EntityManager rm2 = factory2.createEntityManager();

 

Yukarıda EntityManagerFactory ile XML dosyasından ilgili persistence unit yüklenir. Ardından, bu factory nesnesi üzerinden EntityManager yaratılır. Bu nesne aracılığıyla veritabanı işlemleri gerçekleştirilir.

rm2.getEntityManagerFactory().getCache().evict(Sample1.class);

 

Aşağıdaki komut ile Cache sisteminde yer alan kayıtlardan sadece “1” id'li kayıt çıkartılır.

rm2.getEntityManagerFactory().getCache().evict(Sample1.class, rm2.find(Sample1.class, 1L));

 

Cache sistemiyle ilgili anlatacaklarım bu yazı için şimdilik bu kadar. Cache sisteminin optimizasyonu için bir çok yöntem mevcuttur. Bir sonraki makalemde görüşmek dileğiyle.

 

Batuhan Düzgün

Bilgisayar Mühendisi

Endüstri Mühendisi

Currently rated 5.0 by 2 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

Java

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  July 2018  >>
MoTuWeThFrSaSu
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

Yazıları geniş takvimde göster