EclipseLink JPA Layer2 ve Layer1 Cache Yönetimi

Batuhan Düzgün tarafından yayınlanmıştır 3. December 2012 09:50

 

Merhaba arkadaşlar bu yazıda sizlerle birlikte EclipseLink JPA Cache yönetimi konusunu inceleyeceğim. EclipseLink JPA bilindiği üzere veritabanı işlemlerini yöneten ve kontrol eden bir framework'tür. Bu sistem bünyesinde veritabanı ile ilgili performansı arttırmak için cache mekanizması kurmuştur. Layer1 ve Layer2 adında olan bu iki cache sistemini inceleyelim.

 

Layer1 Cache ?

Layer1 cache “EntityManager” kapsamında olan bir sistemdir. Yani EntityManager içeriğinde cachelenmiş olan kayıtlar Layer1 olarak isimlendirilir. Kayıt arama, kayıt silme ve kayıt ekleme gibi veritabanı işlemlerini “EntityManager” içeriği seviyesinde cacheler ve böylece performans kazancı sağlar. Layer1 cache bir kayıt bulunamaz ise, ilgili kayıt Layer2 cache üzerinde aranır ve Layer2 cache üzerinde var iseLayer1 cache'e eklenir.

 

Layer2 Cache ?

Layer2 cache sistemi ise “EntityManager” kapsamından daha büyüktür. EntityManagerFactory düzeyindedir.  Yani aynı EntityManagerFactory'den oluşturulmuş olan EntityManager içerikleri aynı Layer2 cache sistemini kullanır. Aranılan kayıt Layer2'de de bulunamazsa veritabanından getirilir ve cachelenir.

Hazırlanmış senaryoda kitap ve kitaba ait detayları tutan bir veritabanı modeli kurulacaktır. Bu modeli kurarken EclipseLink POJO sınıfları oluşturulacaktır. Aşağıda “Book” ve “BookDetail” isminde iki adet POJO sınıfı oluşturulmuştur.

 

@SuppressWarnings("serial")

@Entity

@Table(name="BookDetail")

public class BookDetail implements Serializable{

                @Id

                @GeneratedValue(strategy=GenerationType.IDENTITY)

                @Column(name="id")

                private Long id;

               

                @Column(name="book_pressed_date")

                private String bookPressedDate;

               

                @Column(name="book_page_count")

                private Integer bookPageCount;

               

                @Column(name="book_type")

                private String bookType;

                public BookDetail() {}

                public Long getId() {

                               return id;

                }

                public void setId(Long id) {

                               this.id = id;

                }

                public String getBookPressedDate() {

                               return bookPressedDate;

                }

                public void setBookPressedDate(String bookPressedDate) {

                               this.bookPressedDate = bookPressedDate;

                }

                public Integer getBookPageCount() {

                               return bookPageCount;

                }

                public void setBookPageCount(Integer bookPageCount) {

                               this.bookPageCount = bookPageCount;

                }

                public String getBookType() {

                               return bookType;

                }

                public void setBookType(String bookType) {

                               this.bookType = bookType;

                }

}

Book sınıfı  ... 

@SuppressWarnings("serial")

@Entity

@Table(name="Book")

public class Book implements Serializable{

                @Id

                @GeneratedValue(strategy=GenerationType.IDENTITY)

                @Column(name="id")

                private Long id;

               

                @Column(name="book_name", length=250)

                private String name;

               

                @Column(name="author_name", length=450)

                private String authorName;

               

                @ManyToOne(cascade=CascadeType.ALL)

                @JoinColumn(name="book_detail_id")

                private BookDetail bookDetail;

                public Book() {}

                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 String getAuthorName() {

                               return authorName;

                }

                public void setAuthorName(String authorName) {

                               this.authorName = authorName;

                }

                public BookDetail getBookDetail() {

                               return bookDetail;

                }

                public void setBookDetail(BookDetail bookDetail) {

                               this.bookDetail = bookDetail;

                }               

}

Veritabanına yeni kayıt eklemek, arama yapmak gibi işlemleri gerçekleştirmek adına bir “menu” metodu hazırlanır. Bu menüden istenilen işlem tipi seçilir ve çalıştırılır. Aşağıda açıklamalar ile birlikte kaynak kodlar verilmiştir.

public class Main {

 

                private static EntityManager entityManager = null;

                private static Scanner scanner = null;

                public static void main(String[] args) {

                               menu();

                }

                public static void menu(){

                               int choice = -1;

                              

                               // Menüden işlem tipi seçilir.

                               while(choice != 6) {

                                               System.out.println("İşlem tipini seçiniz ...");

                                               System.out.println("1-) Kayıt Ekle");

                                               System.out.println("2-) Kayıt Ara");

                                               System.out.println("3-) Kayıt Sil");

                                               System.out.println("4-) Kaydı Layer1'den Sil");

                                               System.out.println("5-) Kaydı Layer2'den Sil");

                                               System.out.println("6-) Çıkış");

                                               choice = getScanner().nextInt();

                                               switch (choice) {

                                                               case 1:{

                                                                              // Yeni kayıt eklenir.

                                                                              addNewRecord();

                                                                              break;

                                                               }

                                                               case 2:{

                                                                              // Kayıt araması yapılır.

                                                                              findRecord();

                                                                              break;

                                                               }

                                                               case 3:{

                                                                              // Kayıt silme işlemi yapılır.

                                                                              deleteRecord();

                                                                              break;

                                                               }

                                                               case 4:{

                                                                              // Layer1 cache testi yapılır.

                                                                              getRecordFromLayer1Cache();

                                                                              break;

                                                               }

                                                               case 5:{

                                                                              // Layer2 cache testi yapılır.

                                                                              getRecordFromLayer2Cache();

                                                                              break;

                                                               }

                                                               case 6:{

                                                                              choice = 6;

                                                                              break;

                                                               }

                                                               default:

                                                                              choice = 6;

                                                                              break;

                                               }

                               }

                }

                // Bu metod ile birlikte yeni bir "Book" kaydı oluşturulur.

                public static void addNewRecord() {

                               // "BookDetail" ve "Book" nesneleri oluşturulur.

                               getEntityManager().getTransaction().begin();

                               BookDetail bookDetail = new BookDetail();

                               System.out.println("Kitaba ait detay bilgileri giriniz.");

                               System.out.println("Kitap basım yılını giriniz");

                               String pressedDate = getScanner().next();

                               bookDetail.setBookPressedDate(pressedDate);

                               System.out.println("Kitap sayfa sayısını giriniz");

                               int pageCount = getScanner().nextInt();

                               bookDetail.setBookPageCount(pageCount);

                               System.out.println("Kitap kitap tipini giriniz");

                               String bookType = getScanner().next();

                               bookDetail.setBookType(bookType);

                              

                               Book book = new Book();

                               System.out.println("Kitap bilgilerini giriniz.");

                               System.out.println("Kitap ismini giriniz");

                               String name = getScanner().next();

                               book.setName(name);

                               System.out.println("Kitap yazar ismini giriniz");

                               String authorName = getScanner().next();

                               book.setAuthorName(authorName);

                               book.setBookDetail(bookDetail);

                              

                               // "persist" metodu ile oluşturulmuş olan "Book" nesnesi "EntityManager" içeriğine eklenir.

                               getEntityManager().persist(book);

                               // "commit" komutu ile yeni kayıtlar veritabanına kaydedilir.

                               getEntityManager().getTransaction().commit();

                }

                // Layer1 cache üzerinden istenilen kayıt bulunur.

                public static void findRecord() {

                               Long recordId = -1L;

                               System.out.println("Aradığınız kaydın ID numarasını giriniz");

                               recordId = getScanner().nextLong();

                               System.out.println(getEntityManager().find(Book.class, recordId).getName());

                }

                // Layer1 cache üzerindeki kayıt silinir ve EntityManager içeriğinden silinir.

                // Kayıt silme olayı veritabanı tarafında da yapılır.

                public static void deleteRecord() {

                               Long recordId = -1L;

                               System.out.println("Aradığınız kaydın ID numarasını giriniz");

                               recordId = getScanner().nextLong();

                               getEntityManager().getTransaction().begin();

                               getEntityManager().remove(getEntityManager().find(Book.class, recordId));

                               getEntityManager().getTransaction().commit();

                }

                public static void getRecordFromLayer1Cache() {

                               // Kayıtlar veritabanından okunup Layer1 ve Layer2 cache içine yerleştirilir.

                               List<Book> books = getEntityManager().createQuery(getEntityManager().getCriteriaBuilder().createQuery(Book.class)).getResultList();

                               Book book = books.get(0);

                               // Layer1 cache'den alınmış olan kayıt durum bilgisi aşağıdaki gibidir.

                               System.out.println("Nesneyi Layer1 cache'e eklemeden önce : " + book.getName());

                               // Kayda ilişkin veriler değiştirilir.

                               book.setName("Gecici Isim");

                               // Değişen kayıt EntityManager içeriğine eklenir.

                               getEntityManager().merge(book);

                               System.out.println("Nesneyi Layer1 cache'e ekledikten sonra : " + book.getName());

                               // Layer1 cache içeriği "clear" metodu ile temizlenir.

                               getEntityManager().clear();

                               // Layer1 cache yeniden veritabanından doldurulur.

                               books = getEntityManager().createQuery(getEntityManager().getCriteriaBuilder().createQuery(Book.class)).getResultList();

                               book = books.get(0);

                               System.out.println("Kitap : " + book.getName());

                }

                public static void getRecordFromLayer2Cache() {

                               // Veritabanından kayıtlar Layer1 ve Layer2 cache içeriğine eklenir.

                               List<Book> books = getEntityManager().createQuery(getEntityManager().getCriteriaBuilder().createQuery(Book.class)).getResultList();

                               Book book = books.get(0);

                               // Layer1 den alınan kayıt örneği.

                               System.out.println("Layer1 Cache'den gelen kayıt : " + book.getName());

                               // Kayıt dğeiştirilir.

                               book.setName("Geçersiz isim");

                               // Değişen kayıt EntityManager içeriğine eklenir.

                               getEntityManager().merge(book);

                               System.out.println("Layer1 Cache'den gelen kayıt : " + book.getName());

                               // Layer1 cache içeriği temizlenir.

                               getEntityManager().clear();

                               // "find" ile aynı kayıt örneği arama yapıldığında, Layer1 cache içeriği boş olduğu için,

                               // Layer2 cache'e gidilir ve kayıt oaradan getirilir.

                               Book tempBook = getEntityManager().find(Book.class, book.getId());

                               System.out.println("Layer2 Cache'den gelen kayıt : " + tempBook.getName());

                               // Layer1 cache içeriği temizlenir.

                               getEntityManager().clear();

                               // Layer2 cache içeriği "evictAll" ile tamamen temizlenir.

                               getEntityManager().getEntityManagerFactory().getCache().evictAll();

                               // "find" metodu ile aynı kayıt örneği arama yapıldığında Layer1 ve Layer2 cache'leri boş olduğu için kayıt veritabanından getirilir.

                               System.out.println("Veritabanından gelen kayıt : " + getEntityManager().find(Book.class, tempBook.getId()).getName());

                }               

                public static EntityManager getEntityManager() {

                               if(entityManager == null) {

                                               EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("MysqlPersistenceUnit");

                                               entityManager = entityManagerFactory.createEntityManager();

                               }

                               return entityManager;

                }

                public static Scanner getScanner() {

                               if(scanner == null) {

                                               scanner = new Scanner(System.in);

                               }

                               return scanner;

                }

}

Layer1 cache sistemi çalıştırıldığında aşağıdaki sonuçlar elde edilir. Veritabanındaki kayıtlar Layer1 cache içeriğine eklenir. Ardından bir kayıt alınır ve verileri değiştirilir. Hemen ardından kayıt EntityManageriçeriğine eklenir. Layer1 cache içeriği temizlendikten sonra, aynı kayıt için arama gerçekleştirilir Layer1 içeriği boş olmasına rağmen kayıtlar Layer2 içeriğinden getirilecektir.

 

Layer2 cache sistemi çalıştırıldığında aşağıdaki sonuçlar elde edilir. Veritabanındaki kayıtlar Layer1 ve Layer2 içeriğine eklenir. Ardından bir kayıt seçilir ve üzerinde değişiklik yapılır. Layer1 cache temizlenir ve ardından Layer2 içeriği tamamen temizlenir. Aynı kayıt ID'si ile arama yapıldığında kayıt veritabanından getirilir.

 

 

Layer1 ve Layer2 cache yönetimi ve anlaşılması adına anlatacaklarım şimdilik bundan ibarettir. Bir sonraki makalemde görüşmek dileğiyle …

Batuhan Düzgün

Bilgisayar Mühendisi

Endüstri Mühendisi

Currently rated 5.0 by 1 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

<<  August 2018  >>
MoTuWeThFrSaSu
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

Yazıları geniş takvimde göster