Java 是否在多个会话中使用集合更新同一对象?
所以我尝试在hibernate中实现适当的多线程来保存和更新操作。 我的每个线程都使用一个新创建的会话及其自己的事务。 一些实体在多个会话中共享Java 是否在多个会话中使用集合更新同一对象?,java,spring,multithreading,hibernate,jpa,Java,Spring,Multithreading,Hibernate,Jpa,所以我尝试在hibernate中实现适当的多线程来保存和更新操作。 我的每个线程都使用一个新创建的会话及其自己的事务。 一些实体在多个会话中共享 更新线程1上会话1中的“Chunk:1” 在线程2上更新会话2中的“Chunk:1” 我总是会遇到“非法尝试将集合与Chunk.inChunk中的两个打开会话关联”异常,有没有办法忽略该异常并直接强制会话保存/更新共享实体?我不知道hibernate会阻止什么 这段代码基本上是同时在多个线程上执行的 var session=database.ope
- 更新线程1上会话1中的“Chunk:1”
- 在线程2上更新会话2中的“Chunk:1”
var session=database.openSession();//sessionFactory.openSession()
session.beginTransaction();
试一试{
//保存我的实体
for(变量标识:标识)
更新(身份);
session.flush();
session.clear();
session.getTransaction().commit();
}捕获(例外e){
GameExtension.getInstance().trace(“更新”);
GameExtension.getInstance().trace(例如getMessage());
session.getTransaction().rollback();
}
session.close();
@实体
@表(…)
公共类块{
公开名单不完整;
}
你知道我该如何解决这个问题吗?我几天前刚刚回答了一个类似的问题。链接如下: 您面临的问题是,在会话1中加载具有集合的实体,然后在该对象仍与打开的会话1关联时,以某种方式将该对象传递给会话2。这根本不起作用,即使在单线程环境中也是如此
从会话1中分离对象或在会话2中重新加载对象。不知道如何强制,但有大量语句阻止同时在多个会话/线程中处理一个实体,例如..@NikolaiDmitriev谢谢!我读到这根本不可能。。。但是我无法想象这一点,因为为什么多个线程不能更新同一个实体?实际上没有真正的理由说明这不起作用。克隆集合怎么样,这样每个会话都会得到另一个具有相同数据的实例?也许你就是这么做的。。。出于好奇,您是否希望通过hibernate orm实现的rdbms能够满足游戏服务器的性能要求?但我认为,hibernate的非线程安全性对于一个会话是有限的,因此在不同的线程中,两个会话应该是可以的。因此,在两个会话中都应该有一个实体,并在两种情况下都附加一个集合,只是不是相同的集合。也许我可以尝试克隆该集合,这是一个好主意。。。目前我只使用hibernate,因为它比编写我自己的查询更容易^^^在不久的将来,我可能会每隔几分钟保存一次,而不是所有的小更改,这是正常游戏的做法。
@Entity
@Table(...)
public class Chunk{
public List<Player> inChunk;
}