1. 程式人生 > >Hibernate查詢問題 如何不使用快取 簡單方法

Hibernate查詢問題 如何不使用快取 簡單方法

如果 使用HIbernate迴圈查詢某個表的話。他會使用快取技術,來提高資料庫效能。

其思路是:第一次執行某個sql語句,記錄下他的引數。第二次執行某個sql語句時候首先拿他的引數表和預設記錄的引數表相比較,如果引數表一致,那麼hibernate不會重新查詢資料庫,而是從快取中讀取他的值。因此連續執行某個查詢語句的話,如果此時資料庫中關於這個表的欄位有更新,將不會顯示。

附:當兩個sql語句完全一樣時候,他們的引數表一致。

解決思路:1.使每次執行的查詢語句都不一樣,但是查詢出的結果都一樣。

   類比:當我們在頁面上輸入於上個頁面一致的地址時候 ,頁面預設不會重新向伺服器提交請求,而是從快取鍾讀取頁面。

如果要求他強制: 向伺服器提交請求,可以,設定頁面的屬性。最簡單的是地址後面加一個無關的隨即書

2.因為快取的生存週期,是一個session。因此,如果,每次我們都開啟、關閉連線,這樣在關閉連線時候,快取預設會清除。

必須搭配事務提交一起使用。

程式碼:

public String TestXX(){ 
  String tag=null;
  Session session=null;
  Transaction tc=null;
  ArrayList arraaylist=new ArrayList();
  try{
   
   session=HibernateSessionFactory.getSession();
   tc=session.beginTransaction();
   String hql="select type from Account where userName='user001'";
   String sql="select type from Account where userName='user001'";
   session.clear();
   Query qy=session.createQuery(hql);
   Query qy1=session.createSQLQuery(sql);
   if(qy!=null){
    List list=qy.list();
    arraaylist=(ArrayList)list;
    tag= arraaylist.get(0)+"";
   }  
   tc.commit(); //重要,不知道為什麼?

  }catch(Exception e){
   e.printStackTrace();
  }
  finally{
   
   session.close(); //重要
  }
  return tag;
 }

public static void main(String [] args) throws InterruptedException{
  MachineBus ab=new MachineBus();
  int i=0;
  while(true){
   Thread thread=Thread.currentThread();
   ab.TextXXX();

   thread.sleep(2000);
  }
 }

凡是,有利有弊,看怎麼取捨。

Hibernate方便,而且提高了效能。但是弊端也是明顯的。