gpt4 book ai didi

mysql - Hibernate/Spring : getHibernateTemplate(). save(...) 卡住/挂起

转载 作者:可可西里 更新时间:2023-11-01 07:38:04 25 4
gpt4 key购买 nike

我将 Hibernate 和 Spring 与 DAO 模式一起使用(所有 Hibernate 依赖项都在一个 *DAO.java 类中)。我有九个单元测试(JUnit),它们创建一些业务对象,保存它们,并对它们执行操作;对象在哈希中(所以我一直重复使用相同的对象)。

我的 JUnit 设置方法调用我的 DAO.deleteAllObjects()调用 getSession().createSQLQuery("DELETE FROM <tablename>").executeUpdate() 的方法对于我的业务对象表(只有一个)。

我的一个单元测试 (#8/9) 卡住了。我推测这是一个数据库死锁,因为 Hibernate 日志文件最后显示了我的删除语句。但是,调试显示它只是 HibernateTemplate.save(someObject)那太冷了。 (Eclipse 显示它在 HibernateTemplate.save(Object) 上卡住,第 694 行。)

另外值得注意的是,单独运行此测试(而不是在 9 个测试的套件中)不会导致任何问题。

我究竟该如何排查和修复此问题?

此外,我正在使用 @Entity注释,如果重要的话。

编辑:我删除了对我的业务对象的重用(在每个方法中使用唯一的对象)——没有什么不同(仍然卡住)。

编辑:这也开始渗透到其他测试中(不能运行多个测试类而不会卡住)

编辑:将卡住测试分成两类是可行的。我现在打算这样做,因为有两个或更多测试类对同一个业务对象类进行单元测试,这是可耻的非 DRY。

交易配置:

    <bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>

<!-- my bean which is exhibiting the hanging behavior -->
<aop:config>
<aop:pointcut id="beanNameHere"
expression="execution(* com.blah.blah.IMyDAO.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="beanNameHere" />
</aop:config>

最佳答案

当卡住发生时会中断应用程序,找到主线程并捕获堆栈跟踪。仔细查看,直到您准确找到正在运行的数据库查询在数据库中阻塞。

您提到单独运行测试工作正常,但运行完整套件会导致问题。如果是这种情况,那么我猜测先前的测试之一仍然有一个事务打开并且锁定了阻塞测试试图访问的某些行。

您的测试是否同时运行?如果是这样,请停止这样做,因为它们可能会相互干扰。

打开 hibernate.show_sql 选项,这样您就可以在控制台中看到所有正在生成的 SQL。

在发生卡住时,您能否找出数据库中哪些行被锁定。例如在 SQLServer 中,您可以运行 sp_lock 来查看这一点,并运行 sp_who 来查看哪些 SQL 进程 ID 正在阻塞另一个进程。

关于mysql - Hibernate/Spring : getHibernateTemplate(). save(...) 卡住/挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4635252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com