之前直接使用hibernate的時候就出現過已經進行物理存儲后的數據,查詢不出來的情況,既然是已經存儲后的數據,說明事務已經提交,想必問題出在查詢時,查詢的緩存,沒有查詢數據庫。時有時無就很奇怪。
現在做項目使用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>
但是偶爾還是會出現已經保存的數據查詢不出來,或者時有時無的情況。
首先嘗試清空緩存
1,hibernateTemplate.clear();沒有效果
2,hibernateTemplate.evict(Peg.class);這個方法最后會調用session.evict(entity);
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。
3,查看hibernateTemplate源代碼,發現這么一段
if(isAlwaysUseNewSession())
SessionFactoryUtils.closeSession(session);
else
SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
也就是說執行完數據庫操作后是否關閉session是根據一個參數判斷的
public HibernateTemplate()
{
allowCreate = true;
alwaysUseNewSession = false;
exposeNativeSession = false;
checkWriteOperations = true;
cacheQueries = false;
fetchSize = 0;
maxResults = 0;
}
這里默認設置的是不必每次都新建一個session,這樣分析有可能兩次操作使用的是同一個session,而session中的緩存數據沒有刷新,所以存在查詢臟讀的問題。
而可能每次去到的session不一樣,時有時無的情況出現了。
試着修改這個參數為true
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
hibernateTemplate.setAlwaysUseNewSession(true);
this.hibernateTemplate = hibernateTemplate;
}
這樣spring初始化的時候容器里的hibernateTemplate實例對象就有了一個為true的參數,每次都會關閉session,重新獲取一個session。
改變后暫時沒有發現問題出現了,但這個問題很奇怪,是偶爾冒出來的,暫時先這樣,繼續觀察,實在搞不定就只能換掉hibernate了。
轉自:https://www.cnblogs.com/yangchengInfo/p/3585264.html
