当前位置: 首页 > 面试题库 >

不同线程中的Hibernate AssertionFailure

诸葛嘉熙
2023-03-14
问题内容

我通过一个会话连接到数据库。在整个程序中,我总是有相同的会话。我的线程“
1”从数据库中捕获主要数据。必须允许用户取消该线程。因此,如果用户频繁或快速按下“取消”按钮(这是我的解释),则会发生以下错误:

ERROR org.hibernate.AssertionFailure - HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session) 
org.hibernate.AssertionFailure: possible non-threadsafe access to the session

如果我取消线程“ 1”完成并尝试从数据库加载另一个主数据集后在后台运行的线程“ 2”,则会发生相同的错误。

我在两个线程中使用同一会话的失败是吗?

解决此类问题的正确方法是什么?


问题答案:

每个线程都应从Hibernate会话工厂获取自己的会话。

并不意味着实现者是线程安全的。相反,每个线程/事务都应从SessionFactory获取其自己的实例。

参见此处:Hibernate Session
JavaDoc

当您“取消”线程时-它应该自己进行清理,例如事务回滚,会话关闭等。



 类似资料:
  • 我试图创建一个环境,在这个环境中设置一个图形用户界面,当用户通过监听器修改它的组件时,另一个线程每隔X秒就向它添加新元素。(这是一个游戏,是的) 我希望游戏在一个类中,而“元素加法器”线程在另一个类中——但Java当然抱怨我无法从另一个线程修改JavaFX GUI。 我见过使用Platform.run稍后()的解决方案,但就我所知,所有这些解决方案都使用匿名内部类。我真的希望我的加法器在另一个(命

  • 问题内容: 据我所知,操作系统创建线程时,每个线程都会获得一个不同的堆栈。我想知道每个线程是否也有与自己不同的堆吗? 问题答案: 否。所有线程共享一个公共堆。 每个线程都有一个专用堆栈,它可以快速添加和删除其中的项目。这样可以使基于堆栈的内存速度更快,但是,如果您使用过多的堆栈内存(如无限递归中所发生的那样),则会导致堆栈溢出。 由于所有线程共享同一个堆,因此必须同步对分配器/释放器的访问。有许多

  • 问题内容: 我已经搜索了很多,但找不到特定的解决方案。关于stackoverflow也有一些问题,但我无法找到满意的答案,所以我再次询问。 我在java中有一个如下类。 我知道如何在Java中使用线程。 现在我想同时执行这两个操作。为此,我创建了两个线程类,一个在运行中执行addString()逻辑,另一个在执行deleteString()逻辑中。我在每个线程的构造函数中传递mylist,但是在对

  • 我有一个带有异步endpoint的quarkus应用程序,它创建一个具有默认属性的实体,在request方法中启动一个新线程,并执行一个长期运行的作业,然后返回该实体作为响应供客户端跟踪。 此外,长时间运行的作业将在实体运行时对其进行更新,因此它也必须是事务性的。但是,数据库实体没有得到更新。 这些是我面临的问题: 收到以下警告: 我尝试使用但没有用。 我尝试在上使用API方法,而不是在指南中提到

  • 我的问题与这个老问题很相似,但没有令人满意的答案贴在那里。 在DB2中有一个DB表,我试图通过两个或多个单独的Java线程对其进行并行记录读取,前提是这些线程应该读取不同的数据集,即如果线程1读取了前1000条记录,线程2不应该选择这些记录,而是选择不同的1000条记录(如果可用的话)。 由于线程将读取不同的行,因此在读取时不会发生冲突。Connection对象也不会在线程之间共享--它们将使用自

  • 问题内容: 使用JMeter,我要检查仅允许1次更新的锁定部分 我正在运行具有10个线程的线程组,并且期望只有1个(并非总是第一个)线程返回0,而其他9个线程返回1如何断言呢? 线程组(10)-HTTP采样器– 断言 编辑 10实际上是一个动态属性。因此,我需要任何线程计数来期望只有1个断言才能返回成功。 该测试是为了检查记录锁定是否正常工作,即使在压力/负载测试中也只能更新一次记录。 编辑2 使