PostgreSQL™には、表 11.2で示すように、DataSourceの実装が2つ含まれます。 1つはプール処理を行い、もう1つはプール処理を行いません。 プール処理の実装では、クライアントがcloseメソッドを呼び出したとしても実際に接続を閉じず、他のクライアントから使用できるようにその接続を利用可能接続のプールに戻します。 これにより繰り返す接続の開閉を行うオーバーヘッドを抑えることができ、また、多くのクライアントが少数のデータベース接続を共有することができます。
ここで提供されるプール処理を行うデータソースの実装は十分な機能を持っているものではありません。 とりわけ、プール自体が閉じた場合でも、接続は決して閉じられませんし、プールを縮小する方法もありません。 同様に、デフォルトで設定されたユーザ以外からの接続はプールされません。 エラー処理において、破損した接続をプールから取り除くことができない場合もあります。 一般的に、PostgreSQL™が提供する接続プールの使用を推奨できません。 アプリケーションサーバをチェックする、または、優秀なjakarta commons DBCPを検討してください。
| プール処理 | 実装クラス |
|---|---|
| No | org.postgresql.ds.PGSimpleDataSource |
| Yes | org.postgresql.ds.PGPoolingDataSource |
どちらの実装も同じ設定スキーマを使用します。 JDBCでは、DataSourceが表 11.3に示すJavaBeanプロパティによって設定可能であることを規定しています。 そのため、各プロパティ用にgetter/setterメソッドがあります。
| プロパティ | 型 | 説明 |
|---|---|---|
| serverName | String | PostgreSQL™データベースサーバのホスト名です。 |
| databaseName | String | PostgreSQL™データベースの名前です。 |
| portNumber | int | PostgreSQL™データベースサーバが監視するTCPポートです。 (または、デフォルトのポートを使用する0です。) |
| user | String | データベース接続の作成に使用するユーザです。 |
| password | String | データベース接続の作成に使用するパスワードです。 |
プール処理を行う実装では、表 11.4に示す設定プロパティが追加で必要です。
表 11.4. プール処理を行うDataSource用追加設定プロパティ
| プロパティ | 型 | 説明 |
|---|---|---|
| dataSourceName | String | プール処理を行うDataSourceはすべて一意な名前を持たなければなりません。 |
| initialConnections | int | プール初期化時に作成されるデータベース接続数です。 |
| maxConnections | int | オープン可能なデータベース接続の最大数です。 これ以上多くの接続が要求された場合、呼び出し元はプールに接続が戻るまで停止します。 |
例 11.1に、プール処理を行うDataSourceを使用する典型的なアプリケーションコードの例を示します。
プール処理を行うDataSourceを初期化するコードは以下のようになります。
PGPoolingDataSource source = new PGPoolingDataSource();
source.setDataSourceName("A Data Source");
source.setServerName("localhost");
source.setDatabaseName("test");
source.setUser("testuser");
source.setPassword("testpassword");
source.setMaxConnections(10);
そして、プールから接続を使用するコードは以下のようになります。
最後に接続を閉じていることが重要であることに注意してください。
さもないと、プールから接続が「漏れ出し」、最後にはすべてのクライアントがロックしてしまいます。
Connection conn = null;
try {
conn = source.getConnection();
// use connection
} catch (SQLException e) {
// log error
} finally {
if (con != null) {
try { conn.close(); } catch (SQLException e) {}
}
}