Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否在多个会话中使用集合更新同一对象?_Java_Spring_Multithreading_Hibernate_Jpa - Fatal编程技术网

Java 是否在多个会话中使用集合更新同一对象?

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

所以我尝试在hibernate中实现适当的多线程来保存和更新操作。 我的每个线程都使用一个新创建的会话及其自己的事务。 一些实体在多个会话中共享

  • 更新线程1上会话1中的“Chunk:1”
  • 在线程2上更新会话2中的“Chunk:1”
我总是会遇到“非法尝试将集合与Chunk.inChunk中的两个打开会话关联”异常,有没有办法忽略该异常并直接强制会话保存/更新共享实体?我不知道hibernate会阻止什么

这段代码基本上是同时在多个线程上执行的

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;
}