0

我有一个使用休眠将数据惰性化到表中的应用程序。数据库是 SQL 服务器。应用程序本身部署在 Tomcat 6 中。要将数据插入 DB 表 - 我使用 BasicDataSource 和 Tomcat 连接池的最低配置(如 MaxActive=150,maxIdle =10....)

现在的问题是 - 我想向应用程序添加并发性。在此过程中 - 我正在对业务层方法进行并发调用,该方法调用执行数据库插入的 dao 级别方法。这导致以下错误:

Exception occurred java.util.concurrent.ExecutionException: org.hibernate.HibernateException: 
Illegal attempt to associate a collection with two open sessions  

当我监视数据库时,我看到正在创建多个线程但没有关闭。

我不确定如何进一步调试/修复此问题。任何指针都会有所帮助。

4

1 回答 1

0

如果 Hibernate 告诉你:

Illegal attempt to associate a collection with two open sessions

基本上,您正在打开两个会话,每个会话都有一个事务,并且您试图将一个事务中的一个会话保存到另一个事务中。雅并发是你这里的主要问题。好吧,如果您设计应用程序以便仔细处理会话,则可以解决此问题。Stack-Trace 将为您提供导致异常的函数。查看您的工作单元在会话中持续多长时间,并尝试减少这些时间,并确保您的会话在使用后始终关闭。

在 hibernate 中实现的应用程序可以有各种模式。

您需要具有 每个请求的会话模式。在这个模型中,来自客户端的请求被发送到运行 Hibernate 持久层的服务器。打开一个新的 Hibernate Session,所有的数据库操作都在这个工作单元中执行。工作完成后,一旦为客户端准备好响应,会话就会被刷新并关闭。使用单个数据库事务来服务客户端请求,在您打开和关闭会话时启动并提交它。两者之间的关系是一对一的,该模型非常适合许多应用程序

Do not use the anti-patterns session-per-user-session or session-per-application

Hibernate 文档中的事务和并发给出了深入的分析和示例

于 2013-10-09T09:38:32.483 回答