使用 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() 上关闭连接(连接泄漏)
在 Spring 中使用 HikariCP 连接到 Oracle DB 时发送应用程序名称
为啥“Quarkus”选择“Agroal”而不是“HikariCP”作为首选数据源和连接池实现? [关闭]