1. 概要

データベース接続を確立するのは非常に費用がかかります。 データベース接続プールは、この支出を削減するための確立された方法です。

このチュートリアルでは、c3p0をHibernateで使用して接続をプールする方法について説明します。

2. c3p0とは何ですか?

c3p0はデータベース接続を管理するための便利な方法を提供するJavaライブラリです

つまり、接続のプールを作成することでこれを実現します。 また、使用後のStatementおよびResultSetのクリーンアップも効果的に処理します。 このクリーンアップは、リソースの使用が最適化され、回避可能なデッドロックが発生しないようにするために必要です。

このライブラリは、さまざまな従来のJDBCドライバーとシームレスに統合されます。さらに、DriverManagerベースのJDBCドライバーを新しいjavax.sql.DataSourceスキームに適合させるためのレイヤーを提供します。

また、HibernateはJDBCを介したデータベースへの接続をサポートしているため、Hibernateとc3p0を一緒に使用するのは簡単です。

3. Hibernateを使用したc3p0の構成

次に、データベース接続マネージャーとしてc3p0を使用するように既存のHibernateアプリケーションを構成する方法を見てみましょう。

3.1. Mavenの依存関係

まず、最初に hibernate-c3p0Maven依存関係を追加する必要があります。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>5.3.6.Final</version>
</dependency>

Hibernate 5では、上記の依存関係を追加するだけでc3p0を有効にできます。 これは、他のJDBC接続プールマネージャーが指定されていない限り当てはまります。

したがって、依存関係を追加した後、アプリケーションを実行してログを確認できます。

Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10]
Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@34d0bdb9 [ ... default settings ... ]

別のJDBC接続プールマネージャーが使用されている場合は、アプリケーションにc3p0を使用させることができます。 プロパティファイルでprovider_classC3P0ConnectionProviderに設定する必要があります。

hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider

3.2. 接続プールのプロパティ

最終的には、デフォルト構成をオーバーライドする必要があります。 hibernate.cfg.xmlファイルにカスタムプロパティを追加できます。

<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.acquire_increment">5</property>
<property name="hibernate.c3p0.timeout">1800</property>

同様に、hibernate.propertiesファイルには同じ設定を含めることができます。

hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.acquire_increment=5
hibernate.c3p0.timeout=1800

min_size プロパティは、任意の時点で維持する必要のある接続の最小数を指定します。 デフォルトでは、少なくとも3つの接続を維持します。 この設定は、プールの初期サイズも定義します。

max_size プロパティは、任意の時点で維持できる接続の最大数を指定します。 デフォルトでは、最大15の接続を保持します

acquire_increment プロパティは、プールで使用可能な接続が不足した場合に取得を試行する接続の数を指定します。 デフォルトでは、3つの新しい接続を取得しようとします。

timeout プロパティは、未使用の接続が破棄されるまでに保持される秒数を指定します。 デフォルトでは、接続がプールから期限切れになることはありません。

ログを再度確認することで、新しいプール設定を確認できます。

Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10]
Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@b0ad7778 [ ... new settings ... ]

これらは、基本的な接続プールのプロパティです。 さらに、他の構成プロパティは公式ガイドにあります。

5. 結論

この記事では、Hibernateでc3p0を使用する方法について説明しました。 いくつかの一般的な構成プロパティを確認し、テストアプリケーションにc3p0を追加しました。

ほとんどの環境では、従来のJDBCドライバーの代わりに、c3p0やHikariCPなどの接続プールマネージャーを使用することをお勧めします。

いつものように、このチュートリアルの完全なソースコードは、GitHubで入手できます。