我在使用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
我已经阅读了很多关于将autocommit设置为0然后设置为1的内容。我知道连接的默认值是1,这种行为无法更改。你可以运行SET autocommit = 0,但结果是相同的。
有没有办法避免这些查询中的任何一项?我不知道为什么会发生SELECT @@session.tx_isolation和回滚。当我使用事务时,我得到一个提交然后回滚。不确定为什么总是会回滚。
非常感谢!
我的配置: Spring 2.5.6,Hibernate 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>
更新:通过设置新属性,成功取消了回滚。
<property name="defaultReadOnly" value="true" />
但现在的问题是,无论我是否将事务注解设置为readOnly=false,都无法对数据库进行修改,会出现SQLException。
这个属性将连接设置为只读模式。
我猜想在HibernateTemplate中没有办法实现这一点。
我使用aspectj事务进行内部代码织入。
<aop:aspectj-autoproxy proxy-target-class="true" />