【问题标题】:Hibernate queries on database数据库上的休眠查询
【发布时间】:2011-11-25 15:49:56
【问题描述】:

我对休眠对数据库执行的查询量有疑问。 这是我在执行简单选择时对数据库的查询日志(使用 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

datasource.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" />

但是现在的问题是您无法对给出 SQLException 的数据库进行修改(无论我是否在事务性注释上设置 readOnly=false)。 此属性将连接只读设置为 true。 我猜 HibernateTemplate 没有办法做到这一点。

我使用 aspectj 事务进行内部代码编织。

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

【问题讨论】:

  • 您的交易失败!您是否在 Spring 上下文中启用了事务管理器?而且你的日志是正常的,我的也差不多,除了回滚。
  • 这只是一个选择,它没有@transactional 注释。似乎一切都被视为交易。
  • 我的意思是本地数据库级别:27 查询回滚。它回滚事务。您的插入或更新是否正常工作?
  • 是的,当我在方法中使用@Transactional 时,如果抛出异常,它会转为提交或回滚。所以插入、更新和选择事务工作。我想我在每个“简单”选择上都增加了回滚的开销

标签: mysql database hibernate spring


【解决方案1】:

您需要为您的应用程序配置事务。请参阅Spring 2.5.x documentation on transaction management

编辑 12/3/11:即使对于只执行选择的方法,您仍然必须创建一个只读事务才能删除您在帖子中提到的额外查询。只需编写 @Transactional(readOnly=true) 就可以了。

编辑 12/20/11:您还需要确保交易配置正确。看起来您发布的配置可能缺少 注释。见section 10.5.1 of the Spring documentation

【讨论】:

  • 我已经添加了事务管理器。我在需要事务时使用 @transactional 注释,但在这种情况下,没有事务正在进行。
  • 即使对于只做选择的方法,您仍然必须创建一个只读事务才能删除您在帖子中提到的额外查询。只需写 @Transactional(readOnly=true) 就可以了。
  • 仍然获得相同的事务回滚和自动提交。我现在也用 readonly=true 得到了一个提交
  • 请查看我的更新回复:您还需要确保交易配置正确。看起来您发布的配置可能缺少 注释。请参阅 Spring 文档的第 10.5.1 节。
  • 我使用 aspectj 事务。检查我帖子的最后一部分。交易运作良好。唯一的问题是查询的数量。我已经看到,如果与数据库的连接是只读的,则不会发生回滚。但这对于事务的只读标志无关紧要。我认为这只会使休眠对脏检查对象和集合没有影响。
猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 2013-11-07
  • 2013-12-20
  • 2014-08-08
  • 2011-08-09
相关资源
最近更新 更多