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(); //重要,不知道為什麼?
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方便,而且提高了效能。但是弊端也是明顯的。