Hibernate禁止了一級、二級、查詢緩存還是不能實時獲取直接在MySQL中更新的記錄的原因。
最近項目中用到了Hibernate,由於mysql數據庫中的數據除了我的webservice應用會修改,還有另外一方的後台管理程序會修改,所有每次查詢就需要實時的從mysql數據庫中獲取最新的數據。可是原以為是個很簡單的事情,把二級和查詢緩存都禁掉,每次sessionFactory.openSession()後用完就close掉(相當於也沒有一級緩存)。可是當我應用程序中的hibernate第一次讀取數據後,再直接在mysql控制台中修改那些記錄中的數據,然後再次用hibernate執行同樣的查詢,雖然確確實實發出了sql查詢語句,可是查詢回來的數據還是更新之前的數據,斷點調試也找不出原因。
最後再網上找到原因說是
Hibernate使用它自己默認的連接池,而它默認的連接池是很有問題的(具體什麼問題不清楚!),使用c3p0連接池就正常了,在hibernate.cfg.xml配置文件裡增加:
<property
name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider>
</property>
<property name="c3p0.min_size">5 </property> <!--在連接池中可用數據庫連接的最小數目-->
<property name="c3p0.max_size">30 </property> <!--在連接池中所有數據庫連接的最大數目-->
<property name="c3p0.time_out">1800 </property> <!--設定數據庫連接的超時時間-->
<property name="c3p0.max_statement">50 </property> <!--可以被緩存的PreparedStatement的最大數目-->
需要下載 c3p0-0.9.1.jar 包,然後從hibernate源碼中的hibernate.cfg.xml把關於c3p0連接池使用的相關的屬性去掉並做相應的修改即可。
Hibernate整體理解 http://www.linuxidc.com/Linux/2014-07/104405.htm
Hibernate工作機制及其常用類和方法 http://www.linuxidc.com/Linux/2011-12/50419.htm
Hibernate 的詳細介紹:請點這裡
Hibernate 的下載地址:請點這裡