多线程异常:"Illegal attempt to associate a collection with two open sessions"?
Multithreading Exception : "Illegal attempt to associate a collection with two open sessions"?
所以我试图实现适当的多线程以在休眠中进行保存和更新操作。我的每个线程都使用一个新创建的会话和自己的事务。
我总是收到“非法尝试将一个集合与两个打开的会话相关联”的异常,因为我同时使用多个会话(我还使用共享会话对其进行了测试,但也没有用)。这里的问题是我需要多个会话,这就是我被告知休眠多线程可以工作的方式。
这段代码基本上是“同时”在多个线程上执行的。
var session = database.openSession(); // sessionFactory.openSession()
session.beginTransaction();
try {
// Save my entities
for (var identity : identities)
session.update(identity);
session.flush();
session.clear();
session.getTransaction().commit();
} catch (Exception e){
GameExtension.getInstance().trace("Save");
GameExtension.getInstance().trace(e.getMessage());
session.getTransaction().rollback();
}
session.close();
那么我该如何解决这个问题呢?我如何保持多个会话并同时防止该异常?
您面临的问题是您使用会话 1 的集合加载实体,然后以某种方式将该对象传递给会话 2,而该对象仍与打开的会话 1 相关联。这根本行不通,即使在单线程环境中。
从会话 1 中分离对象或在会话 2 中重新加载对象。
所以我试图实现适当的多线程以在休眠中进行保存和更新操作。我的每个线程都使用一个新创建的会话和自己的事务。
我总是收到“非法尝试将一个集合与两个打开的会话相关联”的异常,因为我同时使用多个会话(我还使用共享会话对其进行了测试,但也没有用)。这里的问题是我需要多个会话,这就是我被告知休眠多线程可以工作的方式。
这段代码基本上是“同时”在多个线程上执行的。
var session = database.openSession(); // sessionFactory.openSession()
session.beginTransaction();
try {
// Save my entities
for (var identity : identities)
session.update(identity);
session.flush();
session.clear();
session.getTransaction().commit();
} catch (Exception e){
GameExtension.getInstance().trace("Save");
GameExtension.getInstance().trace(e.getMessage());
session.getTransaction().rollback();
}
session.close();
那么我该如何解决这个问题呢?我如何保持多个会话并同时防止该异常?
您面临的问题是您使用会话 1 的集合加载实体,然后以某种方式将该对象传递给会话 2,而该对象仍与打开的会话 1 相关联。这根本行不通,即使在单线程环境中。
从会话 1 中分离对象或在会话 2 中重新加载对象。