2014-07-22 105 views
0

我非常困惑與下面的代碼,試圖避免休眠緩存的輸出。難以捉摸的休眠第二級緩存

我打開一個新的Hibernate會話,運行一個查詢,並檢查結果,當它停在指定的斷點。在繼續執行之前,我會轉到MySQL並刪除或添加一行。當我繼續執行時,查詢仍顯示舊數據和舊行計數,儘管在休眠緩存上調用了evictAllRegions(),而普通的JDBC查詢顯示了更新的計數(如預期的那樣)。

設置hibernate.cache.use_second_level_cachehibernate.cache.use_query_cache假沒有幫助。我猜這應該不重要,因爲緩存正在被手動清除。

那麼,爲什麼Hibernate沒有打到數據庫?

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb..."); 

for (int i = 0; i < 15; i++) { 
    session = HibernateUtil.getSessionFactory().openSession(); 

    // Old data keeps being returned 
    list = session.createCriteria(Language.class).list(); 

    // JDBC fetches expected count 
    Statement statement = conn.createStatement(); 
    ResultSet resultSet = statement.executeQuery("select * from language"); 
    int x = 0; 
    while (resultSet.next()) x++; // count the rows 

[Breakpoint here] 
    session.close(); 
    HibernateUtil.getSessionFactory().getCache().evictAllRegions(); 
} 
+0

您是否檢查過事務隔離? – ThomasEdwin

+0

如果那麼重要,它不應該也影響JDBC調用嗎?無論如何,它都可以在MySQL服務器上進行REPEATABLE-READ。 – user3864701

回答