İki farklı thread’in yakın zaman içinde bu sınıfın nesnesini oluşturmak isteyebilir. Klasik Singleton Tasarım Deseni‘ne göre yakın zaman aralığında olduğu için birbirlerinden habersiz olarak, aynı nesneyi 2 kere oluşturarak gereksiz kaynak kullanımına neden olur. Bunu engellemek için aşağıda ki kodda olduğu gibi synchronized yapısı kullanılarak bu yapının içine giren thread synchronizede ait nesneyi çıkana kadar tutar ve başka thread’in girmesini engeller. Böylece yakın zamanda dahi olsa bu yapılar birbirlerini beklemeden singleton nesnesini oluşturmalarının önüne geçilmiş olur.
Caching Nedir?
Caching, bir web projesinin daha performanslı çalışmasını sağlayan, verileri belli bir süre RAM’de tutarak kullanıcıya hızlı sunum yapan yapılardır.
Aşağıda ki kodda veritabanından bilgiler 2 saatte bir çekilerek RAM’de saklanmaktadır. 2 saati geçmesi durumunda yeniden veritabanı bağlantısı sağlanılarak veriler elde edilir.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
package SingletonCacheOrnek; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /* * bir web projesinde performansarttırmak için cache işlemleri yapılmaktadır. * bu cache işleminde her 2 saatte bir veri gösterimi yenilenmektedir. */ public class SingletonCache { Connection conn=null; Statement stmt=null; ResultSet rs=null; private Calendar queryDate; private List nameList=new ArrayList(); private static SingletonCache instance=null; private static Object lock=new Object(); private SingletonCache(){} public static SingletonCache getInstance(){ if(instance==null){ synchronized (lock) {//1. thread lock nesnesini tutar ve o bırakmadan 2. thread şileme geçmez. if(instance==null){ instance=new SingletonCache(); } } } return instance; } //bu method 2 saatte bir caching işlemi yapmaktadır public List getNameList(){ Calendar intervalBefore=Calendar.getInstance();//tarihi verir intervalBefore.add(Calendar.HOUR,-2);//şuan ki saatten 2 saat çıkartır if(queryDate==null || queryDate.before(intervalBefore)){ //queryDate null veya queryDate de tutulan tarih intervalBefore'dan önce mi? try{ conn=DriverManager.getConnection("veritabani_adi","kullanici_adi","sifre"); stmt=conn.createStatement(); rs=stmt.executeQuery("Select name from personel");//personel tablosundan name sütunu çek while(rs.next()){ nameList.add(rs.getString("name"));//getirilen verilerden name adında ki sütuna ait verileri nameList listesine ekle } queryDate=Calendar.getInstance(); }catch(SQLException e){ e.printStackTrace(); }finally{ try{ if(rs!=null){ rs.close(); rs=null; } if(stmt!=null){ stmt.close(); stmt=null; } if(conn!=null){ conn.close(); conn=null; } }catch(Exception e){ e.printStackTrace(); } } } return nameList; } } |
SingletonCache sınıfını ise Test sınıfı ile test edelim. Veritabanı bağlantısı ayarlarını yapmadığınız sürece hata verecektir.
|
1 2 3 4 5 6 7 8 9 10 |
package SingletonCacheOrnek; import java.util.List; public class Test { public static void main(String[] args){ SingletonCache singletonCache=SingletonCache.getInstance(); List nameList= singletonCache.getNameList(); } } |
İndirmek için: GitHub – Onur ARSLAN





