我非常困惑與下面的代碼,試圖避免休眠緩存的輸出。難以捉摸的休眠第二級緩存
我打開一個新的Hibernate會話,運行一個查詢,並檢查結果,當它停在指定的斷點。在繼續執行之前,我會轉到MySQL並刪除或添加一行。當我繼續執行時,查詢仍顯示舊數據和舊行計數,儘管在休眠緩存上調用了evictAllRegions()
,而普通的JDBC查詢顯示了更新的計數(如預期的那樣)。
設置hibernate.cache.use_second_level_cache和hibernate.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();
}
您是否檢查過事務隔離? – ThomasEdwin
如果那麼重要,它不應該也影響JDBC調用嗎?無論如何,它都可以在MySQL服務器上進行REPEATABLE-READ。 – user3864701