NullPointerException 与 Hibernate criteriaQuery 间歇性发生

Posted

技术标签:

【中文标题】NullPointerException 与 Hibernate criteriaQuery 间歇性发生【英文标题】:NullPointerException happening intermittently with Hibernate criteriaQuery 【发布时间】:2021-04-24 01:54:06 【问题描述】:

我正在多线程环境中开发一个 springboot 应用程序,在该环境中我使用带有 javax.persistence.EntityManager 的 Hibernate 来访问数据库。我有单独的 HikariPools 用于读取和写入查询。

在这里,从数据库(所有读取查询)执行读取操作时的多个线程正在使用单个读取连接(因为我已经自动连接了 entityManager 而没有使用 PersistanceContext)。同样,多个线程也将在 writeEntityManager 的帮助下写入 db,其中所有线程都使用单个连接。

我遇到了 AbstractLockUpgradeEventListener.upgradeLock 的问题。这是间歇性发生的,无法找到确切的根本原因。

几个假设:-

DB 利用率接近 100%。(这可能会给这个问题带来优势) 在执行任何写入查询之前应用锁,如果一个线程花费的时间超过了足够的时间,线程就会饿死

任何人都可以在这里提出一些关于设计或实施策略或可能是实际根本原因的建议。

这只是偶尔发生一次

【问题讨论】:

看起来你以某种方式传递了一个空锁提示,但是没有看到代码,很难说这是怎么发生的。 【参考方案1】:

Hibernate EntityManager 不是线程安全的,你不能在多个线程中使用它。

事实上,EntityManager 和加载的对象不能从多个线程中使用

https://discourse.hibernate.org/t/hibernate-and-multithreading/289

【讨论】:

以上是关于NullPointerException 与 Hibernate criteriaQuery 间歇性发生的主要内容,如果未能解决你的问题,请参考以下文章

NullPointerException 与 android AsyncTask 和 RecyclerView

NullPointerException 与 Hibernate criteriaQuery 间歇性发生

将 Kotlin 属性委托与 by 一起使用时出现 NullPointerException (NPE)

if(null check)-else 与 try catch(NullPointerException) 哪个更有效?

Apache Shiro 与 Spring MVC AuthorizingRealm @Autowired java.lang.NullPointerException

空检查链与捕获NullPointerException