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


之前直接使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM