Hibernate 4 连接池

原文: https://javabeginnerstutorial.com/hibernate/connection-pooling-with-hibernate-4/

我们已经进入了 Hibernate 4 的状态,在这里我们可以更改系统后面的数据库以用于生产用途(因此,H2 数据库就不存在了)。

现在该看一下连接池了,因为 Hibernate 的默认连接池机制是基本的,仅提供给开发和测试使用。

为了获得最佳性能和稳定性,需要使用第三方工具。 市场上有一些产品,其中大多数是免费的,您可以将它们与 Hibernate 一起轻松使用。

C3P0

就像《星球大战》中的黄金翻译和协议机器人一样,主要使用的连接池供应器称为 c3p0。

C3P0 是一个开源连接池,它具有一个 Hibernate 包,您可以将其添加为项目的依赖项,并准备配置该池:

  1. <dependency>
  2. <groupId>org.hibernate</groupId>
  3. <artifactId>hibernate-c3p0</artifactId>
  4. <version>4.3.10.Final</version>
  5. </dependency>

c3p0 连接池的最重要的配置属性如下:

  • c3p0.min_size:池中的最小 JDBC 连接数。 Hibernate 默认值:1
  • c3p0.max_size:池中最大 JDBC 连接数。 Hibernate 默认值:100
  • c3p0.timeout:从池中删除空闲连接时(秒)。 Hibernate 默认值:0,永不过期。
  • c3p0.max_statements:将缓存准备好的语句数。 提高性能。 Hibernate 默认值:0,禁用缓存。
  • c3p0.idle_test_period – 自动验证连接之前的空闲时间(以秒为单位)。 Hibernate 默认值:0

C3P0 的配置

要使用您的应用配置 C3P0,您需要设置以下属性。 在这种情况下,让我们在hibernate.cfg.xml中查看基于 XML 的已知配置:

  1. <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
  2. <property name="hibernate.c3p0.min_size">1</property>
  3. <property name="hibernate.c3p0.max_size">19</property>
  4. <property name="hibernate.c3p0.timeout">120</property>
  5. <property name="hibernate.c3p0.max_statements">10</property>

连接供应器的第一行是可选的,您不必输入它,Hibernate 会知道您正在使用 C3P0。 这是因为位置(包结构)在 Hibernate 版本之间可能会发生变化,并且每次更新到连接供应器类位于不同位置的较新版本时,都会遇到麻烦,这很容易让人感到头痛。

如果在启动服务器时仔细查看日志或控制台输出,则应该看到正在配置 C3P0:

  1. org.hibernate.c3p0.internal.C3P0ConnectionProvider configure

Proxool

Proxool 是 C3P0 的替代连接池,但是它需要更多配置,因此我个人更喜欢 C3P0。

仅设置依赖项和属性是不够的,您需要一个额外的 XML 文件,其中包含 Proxool 的配置信息。

依赖项几乎与 C3P0 相同:

  1. <dependency>
  2. <groupId>org.hibernate</groupId>
  3. <artifactId>hibernate-proxool</artifactId>
  4. <version>4.3.10.Final</version>
  5. </dependency>

Proxool 的配置

如前所述,仅在hibernate.cfg.xml文件中配置 Proxool 是不够的,您还需要一个单独的 XML 文件:

  1. <property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
  2. <property name="hibernate.proxool.pool_alias">proxool</property>
  3. <property name="hibernate.proxool.xml">proxool.xml</property>

与第一行的 C3P0 一样,hibernate.connection.provider_class是可选的。

hibernate.proxool.xml属性中提到了 XML 文件。

proxool.xml包含以下内容:

  1. <proxool-config>
  2. <proxool>
  3. <alias>proxool</alias>
  4. <driver-url>jdbc:h2:file:./example;DB_CLOSE_DELAY=-1;MVCC=TRUE</driver-url>
  5. <driver-class>org.h2.Driver</driver-class>
  6. <driver-properties>
  7. <property name="user" value="sa"></property>
  8. <property name="password" value=""></property>
  9. </driver-properties>
  10. <minimum-connection-count>10</minimum-connection-count>
  11. <maximum-connection-count>20</maximum-connection-count>
  12. </proxool>
  13. </proxool-config>

如您所见,您必须在 Proxool 中提供数据库连接。 这是强制性的。 但是,由于这个原因,您可以从hibernate.cfg.xml文件中保留连接配置。

Proxool 存在一个缺点:您必须定义要使用的方言。 使用 C3P0 和默认的 Hibernate 配置,您无需设置要使用的方言,但 Proxool 需要此信息。

如果一切都已设置好,则在启动应用时,您可以在日志中或控制台上看到以下条目:

org.hibernate.proxool.internal.ProxoolConnectionProvider配置

一般关于配置

Hibernate 使用其魔力来根据您配置的属性来标识要使用的连接池供应器。 但是,您可以使用hibernate.connection.provider_class属性定义连接供应器。

如果未配置连接池,则使用默认值。 启动应用时,它在日志或控制台输出中可见:

  1. org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure

总结

有一些连接池供应器,您可以轻松地将它们与 Hibernate 绑定在一起,从而为您提供良好的数据库连接体验。

配置这些供应器很容易,因为大多数供应器都可以将其 Hibernate 集成包作为项目的依赖项导入,并使所有程序运行。