以前直接使用hibernate的時候就出現過已經進行物理存儲後的數據,查詢不出來的狀況,既然是已經存儲後的數據,說明事務已經提交,想必問題出在查詢時,查詢的緩存,沒有查詢數據庫。時有時無就很奇怪。spring
如今作項目使用spring的hibernateTemplate數據庫
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="springDataManager" class="com.jason.base.util.SpringDataManager"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean>
可是偶爾仍是會出現已經保存的數據查詢不出來,或者時有時無的狀況。緩存
首先嚐試清空緩存session
1,hibernateTemplate.clear();沒有效果fetch
2,hibernateTemplate.evict(Peg.class);這個方法最後會調用session.evict(entity);this
public void evict(final Object entity) throws DataAccessException { executeWithNativeSession(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { session.evict(entity); return null; } final HibernateTemplate this$0; private final Object val$entity; { this$0 = HibernateTemplate.this; entity = obj; super(); } } ); }
可是仍是沒有用,該方法只能是從session中將對象移除,也就是說入參是對象,不是class。spa
3,查看hibernateTemplate源代碼,發現這麼一段hibernate
if(isAlwaysUseNewSession()) SessionFactoryUtils.closeSession(session); else SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
也就是說執行完數據庫操做後是否關閉session是根據一個參數判斷的code
public HibernateTemplate() { allowCreate = true; alwaysUseNewSession = false; exposeNativeSession = false; checkWriteOperations = true; cacheQueries = false; fetchSize = 0; maxResults = 0; }
這裏默認設置的是沒必要每次都新建一個session,這樣分析有可能兩次操做使用的是同一個session,而session中的緩存數據沒有刷新,因此存在查詢髒讀的問題。orm
而可能每次去到的session不同,時有時無的狀況出現了。
試着修改這個參數爲true
private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { hibernateTemplate.setAlwaysUseNewSession(true); this.hibernateTemplate = hibernateTemplate; }
這樣spring初始化的時候容器裏的hibernateTemplate實例對象就有了一個爲true的參數,每次都會關閉session,從新獲取一個session。
改變後暫時沒有發現問題出現了,但這個問題很奇怪,是偶爾冒出來的,暫時先這樣,繼續觀察,實在搞不定就只能換掉hibernate了。