如何解决EntityManagerFactory.close不关闭由hibernate.connection.datasource-property设置的HikariDataSource
我正在将Hibernate 5.4.18与HikariCP 3.4.5一起使用。我的配置是编程的,并且使用hibernate.connection.datasource
-property设置了Hibernate的基础DataSource。奇怪的是,当我然后调用EntityManagerFactory.close()
函数时,它没有调用HikariDataSource的close()
方法,并且连接将保持打开状态。这是期望的行为吗? Oracle文档指出EntityManagerFactory.close()
将“ 关闭工厂,释放其拥有的所有资源”。
Kotlin的最小示例:
fun main() {
val emf = Persistence.createEntityManagerFactory("default",getJpaProperties())
// Fetch underlying HikariDataSource
val ds = emf.unwrap(SessionFactoryImpl::class.java)
.serviceRegistry
.getService<ConnectionProvider>(ConnectionProvider::class.java)
.unwrap(HikariDataSource::class.java)
emf.close()
println(ds.isClosed) // prints "false"
}
private fun getJpaProperties(): Map<String,Any> {
val dataSource = HikariDataSource().apply {
username = "sa"
password = ""
jdbcUrl = "jdbc:h2:mem:test_db"
}
return mapOf(
"hibernate.dialect" to "org.hibernate.dialect.H2Dialect","hibernate.connection.datasource" to dataSource
)
}
解决方法
这是因为您要提供数据源的实例。如果初始化DS,则很有可能会在代码的其他部分中使用它,因此关闭数据源将引入意外的行为。这实际上是一种好习惯,创建资源的“模块”也负责处理它。
如果您提供数据源的详细信息(用户名,密码,类名等),则Hibernate将关闭数据源,因为它将由Hibernate管理。
从过去的历史来看,DS是由J2EE容器(例如Tomcat)创建的,然后在该容器内的许多应用程序之间共享。属性hibernate.connection.datasource
将是一个指向数据源的JNDI位置。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。