hibernate - jpa自定义连接池

标签 hibernate tomcat jpa hikaricp

我已经成功地将 hibernate 集成到我的网络应用程序中。我对我的 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>

但如果我尝试设置 minimumPoolSizemaximumPoolSizeuserpassword,我会收到错误消息。如果将它们注释掉,一切都会很好。

org.hibernate.HibernateException: java.lang.RuntimeException: java.beans.IntrospectionException: Method not found: setMinimumPoolSize

如何配置 jpa 以将 hibernate 与 hikaricp 池一起使用?我不想在我的代码中散布 hibernate 特定的东西,因为我想保持 ORM 层抽象。 我发现了很多令人困惑的 Material ,得到的问题多于答案。 persistence.xml、hibernate.properties 和 hibernate.cfg.xml 如何相互关联?什么是 JNDI 以及如何使用它?什么是this bean配置?

最佳答案

对于最初的问题,我们深表歉意。经过更多研究,我找到了解决方案。 这是有效的 persistence.xml。我认为 userpassword 不能在 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>

关于hibernate - jpa自定义连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28856513/

相关文章:

java - Spring、MySQL 和 Hibernate 返回针对列 'row_id' 调整的超出范围值

hibernate - JPA 事务的工作原理

mysql - 异常 : java. util.LinkedHashMap 无法转换为 com.excel.entity.ClassA

java - Hibernate - 软删除 - 多个参数

java - JPA 是否支持从数据库 View 获取数据?

java - Apache CXF AtomPullServer

Java servlet 不写入响应字节

java - 如何在露天访问 session 工厂(数据源)?

spring - Null ModelAndView 返回给 DispatcherServlet

apache - 减少 Tomcat 负载平衡器故障转移的时间