hibernate查詢出的數據和數據庫不一致

以前直接使用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了。

相關文章
相關標籤/搜索