# Hibernate 4 连接池

> 原文： [https://javabeginnerstutorial.com/hibernate/connection-pooling-with-hibernate-4/](https://javabeginnerstutorial.com/hibernate/connection-pooling-with-hibernate-4/)

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

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

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

## C3P0

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

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

```java
<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-c3p0</artifactId>
 <version>4.3.10.Final</version>
 </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 的已知配置：

```java
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
 <property name="hibernate.c3p0.min_size">1</property>
 <property name="hibernate.c3p0.max_size">19</property>
 <property name="hibernate.c3p0.timeout">120</property>
 <property name="hibernate.c3p0.max_statements">10</property>
```

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

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

```java
org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
```

## Proxool

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

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

依赖项几乎与 C3P0 相同：

```java
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-proxool</artifactId>
    <version>4.3.10.Final</version>
 </dependency>
```

### Proxool 的配置

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

```java
<property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
 <property name="hibernate.proxool.pool_alias">proxool</property>
 <property name="hibernate.proxool.xml">proxool.xml</property>
```

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

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

`proxool.xml`包含以下内容：

```java
<proxool-config>
    <proxool>
        <alias>proxool</alias>
        <driver-url>jdbc:h2:file:./example;DB_CLOSE_DELAY=-1;MVCC=TRUE</driver-url>
        <driver-class>org.h2.Driver</driver-class>
        <driver-properties>
            <property name="user" value="sa"></property>
            <property name="password" value=""></property>
        </driver-properties>
        <minimum-connection-count>10</minimum-connection-count>
        <maximum-connection-count>20</maximum-connection-count>
    </proxool>
 </proxool-config>
```

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

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

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

`org.hibernate.proxool.internal.ProxoolConnectionProvider`配置

## 一般关于配置

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

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

```java
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
```

## 总结

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

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

