jpa自定义连接池
jpa custom connection pool
我已经成功地将休眠集成到我的网络应用程序中。我对自己的 persistence.xml
配置感到满意
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="PU">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.url" value="jdbc:sqlite:/tmp/database.db" />
<property name="hibernate.connection.driver_class" value="org.sqlite.JDBC" />
</properties>
</persistence-unit>
</persistence>
然后我决定在阅读this
后使用HikariCp连接池
The built-in connection pool is not intended for production environments
使用 this 示例,我设法使其部分适用于新的 persistence.xml
<persistence-unit name="PU">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.provider_class" value="com.zaxxer.hikari.hibernate.HikariConnectionProvider" />
<property name="hibernate.hikari.minimumPoolSize" value="20" />
<!-- <property name="hibernate.hikari.maximumPoolSize" value="100" /> -->
<property name="hibernate.hikari.idleTimeout" value="30000" />
<property name="hibernate.hikari.dataSourceClassName" value="org.sqlite.SQLiteDataSource" />
<property name="hibernate.hikari.dataSource.url" value="jdbc:sqlite:/tmp/database.db" />
<!-- <property name="hibernate.hikari.dataSource.user" value="" />
<property name="hibernate.hikari.dataSource.password" value="" /> -->
</properties>
</persistence-unit>
但是如果我尝试设置 minimumPoolSize、maximumPoolSize、user 和密码。如果将它们注释掉,一切都会很好。
org.hibernate.HibernateException: java.lang.RuntimeException: java.beans.IntrospectionException: Method not found: setMinimumPoolSize
如何配置 jpa 以将休眠与 hikaricp 池一起使用?我不想在我的代码中散布休眠特定的东西,因为我想保持 ORM 层抽象。
我发现了很多令人困惑的材料,得到的问题多于答案。 persistence.xml、hibernate.properties 和 hibernate.cfg.xml 之间有什么关系?什么是 JNDI 以及如何使用它?什么是 this bean 配置?
请参阅以下线程,解释如何为 HikariCP 设置 spring bean。
How to set up datasource with Spring for HikariCP?
很抱歉原来的问题。经过更多研究,我找到了解决方案。
这正在工作 persistence.xml
。我认为 user
和 password
不能在 sqlite 中设置。 minimumPoolSize -> minimumIdle
<properties>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.provider_class" value="com.zaxxer.hikari.hibernate.HikariConnectionProvider" />
<property name="hibernate.hikari.minimumIdle" value="20" />
<property name="hibernate.hikari.maximumPoolSize" value="100" />
<property name="hibernate.hikari.idleTimeout" value="30000" />
<property name="hibernate.hikari.dataSourceClassName" value="org.sqlite.SQLiteDataSource" />
<property name="hibernate.hikari.dataSource.url" value="jdbc:sqlite:/tmp/database.db" />
</properties>
正如@neil 和@zeus 建议的那样,这里是另一种使用 JNDI 的配置
<properties>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.datasource" value="java:comp/env/jdbc/SQLiteHikari"/>
</properties>
src->main->webapp->META-INF->context.xml
<Context antiJARLocking="true" path="/nbs">
<Resource name="jdbc/SQLiteHikari"
auth="Container"
factory="com.zaxxer.hikari.HikariJNDIFactory"
type="javax.sql.DataSource"
minimumIdle="20"
maximumPoolSize="100"
connectionTimeout="300000"
dataSourceClassName="org.sqlite.SQLiteDataSource"
dataSource.url="jdbc:sqlite:/tmp/database.db" />
</Context>
我已经成功地将休眠集成到我的网络应用程序中。我对自己的 persistence.xml
配置感到满意
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="PU">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.url" value="jdbc:sqlite:/tmp/database.db" />
<property name="hibernate.connection.driver_class" value="org.sqlite.JDBC" />
</properties>
</persistence-unit>
</persistence>
然后我决定在阅读this
后使用HikariCp连接池The built-in connection pool is not intended for production environments
使用 this 示例,我设法使其部分适用于新的 persistence.xml
<persistence-unit name="PU">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.provider_class" value="com.zaxxer.hikari.hibernate.HikariConnectionProvider" />
<property name="hibernate.hikari.minimumPoolSize" value="20" />
<!-- <property name="hibernate.hikari.maximumPoolSize" value="100" /> -->
<property name="hibernate.hikari.idleTimeout" value="30000" />
<property name="hibernate.hikari.dataSourceClassName" value="org.sqlite.SQLiteDataSource" />
<property name="hibernate.hikari.dataSource.url" value="jdbc:sqlite:/tmp/database.db" />
<!-- <property name="hibernate.hikari.dataSource.user" value="" />
<property name="hibernate.hikari.dataSource.password" value="" /> -->
</properties>
</persistence-unit>
但是如果我尝试设置 minimumPoolSize、maximumPoolSize、user 和密码。如果将它们注释掉,一切都会很好。
org.hibernate.HibernateException: java.lang.RuntimeException: java.beans.IntrospectionException: Method not found: setMinimumPoolSize
如何配置 jpa 以将休眠与 hikaricp 池一起使用?我不想在我的代码中散布休眠特定的东西,因为我想保持 ORM 层抽象。 我发现了很多令人困惑的材料,得到的问题多于答案。 persistence.xml、hibernate.properties 和 hibernate.cfg.xml 之间有什么关系?什么是 JNDI 以及如何使用它?什么是 this bean 配置?
请参阅以下线程,解释如何为 HikariCP 设置 spring bean。
How to set up datasource with Spring for HikariCP?
很抱歉原来的问题。经过更多研究,我找到了解决方案。
这正在工作 persistence.xml
。我认为 user
和 password
不能在 sqlite 中设置。 minimumPoolSize -> minimumIdle
<properties>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.provider_class" value="com.zaxxer.hikari.hibernate.HikariConnectionProvider" />
<property name="hibernate.hikari.minimumIdle" value="20" />
<property name="hibernate.hikari.maximumPoolSize" value="100" />
<property name="hibernate.hikari.idleTimeout" value="30000" />
<property name="hibernate.hikari.dataSourceClassName" value="org.sqlite.SQLiteDataSource" />
<property name="hibernate.hikari.dataSource.url" value="jdbc:sqlite:/tmp/database.db" />
</properties>
正如@neil 和@zeus 建议的那样,这里是另一种使用 JNDI 的配置
<properties>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.datasource" value="java:comp/env/jdbc/SQLiteHikari"/>
</properties>
src->main->webapp->META-INF->context.xml
<Context antiJARLocking="true" path="/nbs">
<Resource name="jdbc/SQLiteHikari"
auth="Container"
factory="com.zaxxer.hikari.HikariJNDIFactory"
type="javax.sql.DataSource"
minimumIdle="20"
maximumPoolSize="100"
connectionTimeout="300000"
dataSourceClassName="org.sqlite.SQLiteDataSource"
dataSource.url="jdbc:sqlite:/tmp/database.db" />
</Context>