Java EntityManagerFactory.close()未关闭hibernate.connection.datasource-property设置的HikariDataSource

Java EntityManagerFactory.close()未关闭hibernate.connection.datasource-property设置的HikariDataSource,java,hibernate,kotlin,jpa,hikaricp,Java,Hibernate,Kotlin,Jpa,Hikaricp,我将Hibernate 5.4.18与HikariCP 3.4.5结合使用。我的配置是编程的,我使用Hibernate.connection.DataSource-property设置Hibernate的底层数据源。奇怪的是,当我随后调用EntityManagerFactory.close()-函数时,它没有调用HikariDataSource的close()-方法,连接将保持打开状态。这是你想要的行为吗?Oracle文档称,EntityManagerFactory.close()将“关闭工厂,

我将Hibernate 5.4.18与HikariCP 3.4.5结合使用。我的配置是编程的,我使用
Hibernate.connection.DataSource
-property设置Hibernate的底层数据源。奇怪的是,当我随后调用
EntityManagerFactory.close()
-函数时,它没有调用HikariDataSource的
close()
-方法,连接将保持打开状态。这是你想要的行为吗?Oracle文档称,
EntityManagerFactory.close()
将“关闭工厂,释放其拥有的所有资源”

Kotlin的最低示例:

fun main(){
val emf=Persistence.createEntityManagerFactory(“默认”,getjpapProperties())
//获取基础HikariDataSource
val ds=emf.unwrap(sessionfactorympl::class.java)
.serviceRegistry
.getService(ConnectionProvider::class.java)
.unwrap(HikariDataSource::class.java)
emf.close()
println(ds.isClosed)//打印“false”
}
private fun getJpaProperties():映射{
val dataSource=HikariDataSource().apply{
username=“sa”
password=“”
jdbcUrl=“jdbc:h2:mem:test\u db”
}
返回地图(
“hibernate.dialogue”到“org.hibernate.dialogue.h2dialogue”,
“hibernate.connection.datasource”到数据源
)
}

这是因为您提供了一个数据源实例。如果初始化DS,则很有可能在代码的其他部分使用它,因此关闭数据源将引入意外行为。这实际上是一个很好的实践,即创建资源的“模块”也负责处理它

如果您提供数据源的详细信息(用户名、密码、类名等),Hibernate将关闭该数据源,因为它将由Hibernate管理


历史上,在过去,DS将由J2EE容器(例如Tomcat)在中创建,然后在该容器中的许多应用程序之间共享。属性
hibernate.connection.datasource
将是一个指向数据源的JNDI位置。

听起来很合乎逻辑,尽管我认为这很容易丢失和泄漏资源。