2011-11-25 89 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