使用 HikariCP 时在每次 db 操作后关闭 EntityManager

Posted

技术标签:

【中文标题】使用 HikariCP 时在每次 db 操作后关闭 EntityManager【英文标题】:Closing EntityManager after each db operation when using HikariCP 【发布时间】:2021-01-26 12:04:11 【问题描述】:

我正在使用 EntityManager 和 HikariCP 进行数据库操作。每次操作后是否需要关闭实体管理器? 每个请求只有一个数据库操作

@Autowired
@PersisitentContext(unitname="datasource2")
private EntityManager entityManager

function() 

entityManager.createQuery(......);

entityManage.close(); // Is this required???




【问题讨论】:

【参考方案1】:

是的,您需要在从创建它的方法返回之前关闭它。一种常见的方法是将 EM 嵌入到 try/catch/finally 块中,调用 em.close();在 finally 的情况下。

【讨论】:

EntityManger 实例未在函数中创建。它是自动装配的,是一个类变量。 在这种情况下,容器为我们创建了 EntityManager,这意味着容器负责开始事务,以及提交或回滚事务。同样,容器负责关闭 EntityManager,因此无需手动清理即可安全使用。即使我们尝试关闭容器管理的 EntityManager,它也应该抛出 IllegalStateException。

以上是关于使用 HikariCP 时在每次 db 操作后关闭 EntityManager的主要内容,如果未能解决你的问题,请参考以下文章

HikariCP 未在 close() 上关闭连接(连接泄漏)

DB连接池HikariCP为什么如此快

在 Spring 中使用 HikariCP 连接到 Oracle DB 时发送应用程序名称

为啥“Quarkus”选择“Agroal”而不是“HikariCP”作为首选数据源和连接池实现? [关闭]

java.sql.SQLException:连接已关闭 [POOL-HikariCP]

用 HikariCP 深入理解 Spring boot