2011-11-25 109 views
5

我遇到了由hibernate對數據庫完成的查詢數量的問題。 這裏的(使用MySQL 5.1)做一個簡單的選擇時,我的查詢記錄到數據庫:休眠在數據庫上的查詢

111125 7:18:30 
27 Query SET autocommit=0 
27 Query SELECT @@session.tx_isolation 
27 Query select this_.id as id34_0_, this_.media_id as media3_34_0_, this_.message as message34_0_, this_.user_id as user4_34_0_ from notifications this_ 
27 Query rollback 
27 Query SET autocommit=1 

我已經讀了很多關於設置自動爲0,然後到1。我知道,默認的連接是1,這種行爲不能改變。你可以運行SET autocommit = 0,但結果是一樣的。

無論如何避免任何這些查詢?我不知道爲什麼會發生SELECT @@ session.tx_isolation和回滾。當我使用事務時,我得到一個提交然後回滾。不知道爲什麼回滾總是被電纜連接。

非常感謝!

我的conf: 春2.5.6,3.6.0休眠,MySQL 5.1中

datasoure.xml:

<bean id="dataSource" destroy-method="close" 
    class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 

    <property name="initialSize" value="3" /> 
    <property name="maxActive" value="20" /> 
    <property name="minIdle" value="3" /> 
    <property name="poolPreparedStatements" value="false" /> 
    <property name="defaultAutoCommit" value="false" /> 
    <property name="defaultTransactionIsolation" value="4" /> 
</bean> 

事務管理的定義:

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

UPDATE:管理通過設置新的屬性來取消回滾

<property name="defaultReadOnly" value="true" /> 

但現在的問題是,您無法對發出SQLException的數據庫進行修改(無論是否設置了事務性註釋readOnly = false)。 該屬性將連接只讀設置爲true。 我猜是沒有辦法用HibernateTemplate做到這一點。

我使用aspectj事務進行內部代碼編織。

<aop:aspectj-autoproxy proxy-target-class="true" /> 
+0

您的交易失敗!你是否在春天啓用了事務管理器?而你的日誌是正常的,我的是類似的,除了回滾。 – madhead

+0

這只是一個選擇,它沒有@transactional註釋。似乎所有事情都被視爲交易。 – Gonzalo

+0

我的意思是本機數據庫級別:27查詢回滾。它回滾交易。您的插入或更新是否正常工作? – madhead

回答

1

您需要爲您的應用程序配置事務。請參閱Spring 2.5.x documentation on transaction management

編輯12/3/11:即使對於只做選擇的方法,您仍然必須創建一個只讀事務以刪除您在帖子中提到的額外查詢。只要寫@Transactional(readOnly = true),你應該很好走。

編輯12/20/11:您還需要確保交易配置正確。它看起來像您發佈的配置可能會丟失< tx:註釋驅動/>註釋。見section 10.5.1 of the Spring documentation

+0

我已經添加了事務管理器。當我需要交易時,我使用@transactional批註,但在這種情況下,沒有交易正在進行。 – Gonzalo

+0

即使對於只做選擇的方法,您仍然必須創建一個只讀事務,以刪除您在帖子中提到的額外查詢。只要寫@Transactional(readOnly = true),你應該很好走。 – user393274

+0

仍然收到相同的事務回滾和自動提交。我現在還得到一個提交readonly = true – Gonzalo