【问题标题】:jpa custom connection pooljpa 自定义连接池
【发布时间】:2015-03-04 14:06:36
【问题描述】:

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

内置连接池不适用于生产环境

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:找不到方法:setMinimumPoolSize

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

【问题讨论】:

  • hibernate.* 文件与 JPA 无关,如果想要保持便携性,则不应使用。任何连接池都可以使用内部 JPA 实现代码(就像您尝试的那样),或者您可以设置一个配置为提供池的 javax.sql.DataSource(然后可以与任何 JPA 实现一起使用)
  • 如果您正在处理 JPA,那么只需担心用于配置的 persistence.xml 文件。如果您将某些内容放入 hibernate.* 文件中,那么您正在配置 Hibernate 特定的设置,这不是您想要的。您将使用 JNDI 作为数据源部分,如果您有企业服务器(Jboss、weblogic、websphere),您将在服务器管理控制台(包括池配置)中创建数据源并为其分配 JNDI 名称.无需在 persistence.xml 中配置连接、连接池等,您只需在同一文件中提供 jndi 名称即可。
  • 设置javax.sql.DataSource配置JNDI一样吗?在这种情况下,我是否应该在部署 Web 应用的每台服务器上配置特定的 Catalina 文件?

标签: hibernate tomcat jpa hikaricp


【解决方案1】:

很抱歉原来的问题。经过更多研究,我找到了解决方案。 这是工作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 4.3.6+,他们现在为 HikariCP 提供了自己的 ConnectionProvider。在此处查看更新github.com/brettwooldridge/HikariCP/wiki/Hibernate4
  • 我不喜欢他们使用 hikari v1.3.5。也许我不应该担心这个。
  • 哦,我没有意识到他们被锁定到那个版本。如果可以,请打开错误请求让他们更新。
【解决方案2】:

请参考以下线程,解释如何为 HikariCP 设置 spring bean。

How to set up datasource with Spring for HikariCP?

【讨论】:

  • 谢谢,但我没有使用弹簧。我正在尝试使 hikari 与 jpa 配置一起使用
  • 没关系。那我想我帮不了你。
猜你喜欢
  • 2016-01-27
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多