使用HikariCP配置Hibernate

Voj*_*ěch 8 java hibernate database-connection c3p0 hikaricp

由于c3p0连接池的问题,我想看看替代方案,并决定哪一个可能更适用于我的情况.HikariCP看起来非常有前景,但没有文档说明如何将它与Hibernate一起使用.

到目前为止,我使用c3p0如下:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="persistenceUnit"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">${database.dialect}</prop>
            <prop key="hibernate.hbm2ddl.auto">${database.structure}</prop>
            <prop key="hibernate.connection.url">${database.connection}</prop>
            <prop key="hibernate.connection.username">${database.username}</prop>
            <prop key="hibernate.connection.password">${database.password}</prop>
            <prop key="hibernate.connection.driver_class">${database.driver}</prop>
            <prop key="hibernate.connection.shutdown">true</prop>
            <prop key="hibernate.connection.writedelay">0</prop>
            <prop key="hibernate.connection.characterEncoding">UTF-8</prop>
            <prop key="hibernate.connection.charSet">UTF-8</prop>
            <prop key="hibernate.show_sql">${database.show_sql}</prop>
            <prop key="hibernate.format_sql">false</prop>
            <prop key="hibernate.ejb.metamodel.generation">disabled</prop>
            <!-- Use the C3P0 connection pool provider -->
            <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
            <prop key="hibernate.c3p0.min_size">5</prop>
            <prop key="hibernate.c3p0.max_size">30</prop>
            <prop key="hibernate.c3p0.timeout">300</prop>
            <prop key="hibernate.c3p0.max_statements">50</prop>
            <prop key="hibernate.c3p0.idle_test_period">600</prop>
        </props>
    </property>
Run Code Online (Sandbox Code Playgroud)

有人能指出我如何以这种方式配置HikariCP吗?

uwo*_*fer 18

您可以使用包装org.hibernate.hikaricp.internal.HikariCPConnectionProvider附带的hibernate-hikaricp.

您可以将其安装为Maven依赖项(请不要忘记更新版本号):

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-hikaricp</artifactId>
    <version>5.2.10.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

并在hibernate.properties中配置它:

`hibernate.connection.provider_class=org.hibernate.hikaricp.internal.HikariCPConnectionProvider`
Run Code Online (Sandbox Code Playgroud)

请注意:从Hibernate 4.3.6开始,您不应使用com.zaxxer.hikari.hibernate.HikariConnectionProvider(参见:https://github.com/brettwooldridge/HikariCP/wiki/Hibernate4)

  • HikariCP的作者在这里.我可以确认这是现在正确的答案. (7认同)
  • @uwolfer我认为你的意思是:从Hibernate 4.3.6开始不再使用com.zaxxer.hikari.hibernate.HikariConnectionProvider;) (3认同)

bre*_*ttw 10

HikariCP,为1.2.6版本,现在支持休眠4.x中明确将其ConnectionProvider来.有关详细信息,请参阅新的wiki文档.

  • 这不再是在Hibernate中使用HikariCP的建议方法 - 请参阅我的回答,其中包括详细信息. (2认同)

bre*_*ttw 5

更新:请参阅下面 uwolfer 的回答,它现在是在 Hibernate 中使用 HikariCP 的官方方法。

我是 HikariCP 的作者之一。我并没有声称自己是 Spring 人,几年前我也不再使用 Hibernate,但此链接可能会有所帮助:

http://www.luckyryan.com/2013/02/20/spring-mvc-with-basic-persistence-spring-data-jpa-hibernate/

在该页面的 XML 配置部分,他们的示例使用BoneCP作为mainDataSource,只需尝试用HikariCP 的配置替换该部分即可

在上面的示例中,您似乎是通过 Spring 配置 Hibernate 并定义DataSourceHibernate 配置的内部,这很好。但是另一种方法(在该页面上显示)是DataSource通过 Spring 单独配置它,然后指示 Hibernate 使用它。

关于语句缓存,HikariCP不这样做,因为我们认为最好留给供应商的 JDBC 驱动程序/数据源。几乎各大DB厂商的JDBC都DataSource提供了语句缓存,可以通过HikariCP通过指定DataSource属性进行配置。有关如何在底层(供应商)上设置属性,请参阅HikariCP github 页面DataSource

  • 据我了解该页面,它们提供了两种完成相同任务的方法:*xml* 和 *programatically*。编程方法完全是可选的,应该不需要 Java 代码。我发现 ``DataSource`` 和 ``Hibernate`` 配置的分离很吸引人。不言而喻,我还发现 Hibernate 的“ConnectionProvider”语义令人厌恶,如果我在 JBoss 工作,工程师会被解雇。基本上它引入了一个新接口,它唯一的贡献是“supportsAggressiveRelease”,它可以很容易地表示为一个配置属性。 (2认同)