【问题标题】:inserting data into a table concurrently - hibernate将数据同时插入表中 - 休眠
【发布时间】:2013-09-29 20:28:45
【问题描述】:

我有一个使用休眠将数据惰性化到表中的应用程序。 数据库是 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  

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

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

【问题讨论】:

  • 首先阅读堆栈跟踪,并了解您在堆栈跟踪中出现的代码中所做的事情。您的代码中存在错误。
  • 如何管理事务和数据库连接?

标签: database hibernate concurrency insert tomcat6


【解决方案1】:

如果 Hibernate 告诉你:

Illegal attempt to associate a collection with two open sessions

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

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

您需要有 session-per-request 模式。在这个模型中,一个 来自客户端的请求被发送到服务器,其中 Hibernate 持久层运行。一个新的 Hibernate Session 被打开,所有 数据库操作在这个工作单元中执行。在结束的时候 工作,一旦为客户准备好响应, 会话被刷新并关闭。使用单个数据库事务 服务于客户的请求,在您打开时启动并提交它 并关闭会话。两者的关系是一对一的 而且这个模型非常适合许多应用程序

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

Hibernate 文档中的Transaction And Concurrency 给出了深入的分析和示例

【讨论】:

  • 感谢您的详细解答
猜你喜欢
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2018-12-07
  • 2013-02-28
相关资源
最近更新 更多