DBCPを使う
コネクションプーリング
コネクションプーリングとは、コネクションをトランザクション毎に作成、解放するのではなく、一度作成したコネクションを解放せずに使い回す事で、データベースアクセスの負荷を減らす手法です。コネクションの作成コストは高いので負荷軽減に大きく貢献します。
J2EEアプリケーションでは、J2EEコンテナがプーリング機能を持ったDataSourceを提供しているため特に意識せずにコネクションプーリングを利用できます。通常J2EE環境では、JNDIサービスを通してDataSourceを利用します。DataSourceの設定を行うとコンテナがデータソースをJNDIに登録し、J2EEアプリ中で登録したDataSourceをlookupして取得することができます。
InitialContext ic = new InitialContext(); DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/Postgres"); Connection conn = ds.getConnection();
非J2EE環境でコネクションプーリング
J2SE環境でのデータベースアクセスには通常DriverManagerを使いますが、Jakarta commonsのDBCPというライブラリを使用するとDataSourceを使ったコネクション取得が可能となります。DBCPはコネクションプーリング機能も提供しており、これを利用する事で非J2EE環境でも簡単にコネクションプーリングを利用する事ができます。
DBCPはTomcatのコネクションプーリング実装に利用されており、実績のある信頼性の高いライブラリです。
- Jakarta-Commons DBCP 1.0以降
- Jakarta-Commons Collections 2.0以降
- Jakarta-Commons Pool 1.0以降
これらのjarをダウンロードしてクラスパスに加えます。以下のコードでDBCPを取得します。
BasicDataSource ds = new BasicDataSource(); ds.setDriverClassName(driverName); ds.setUsername(dbUser); ds.setPassword(dbPass); ds.setUrl(jdbcUrl); ds.setDefaultAutoCommit(true); ds.setDefaultReadOnly(false); // プーリングされたコネクションを取得 Connection c = ds.getConnection(); // JDBC処理 // ここでコネクションは解放されず、プールに戻されるのみ c.close();
BasicDataSourceには、プールする初期コネクション数や最大コネクション数、コネクションを解放するまでの待ち時間などを設定するメソッドがあります。アプリに合わせてカスタマイズすると良いでしょう。
コネクションプーリングではConnection#closeを呼んでも実際にはclose処理は行われません。Connectionオブジェクトがコネクションプールに戻されるだけでConnection#closeと同時にコミット(AutoCommitがoffの場合)されたり、リソースが開放がされたりしません。必ず明示的にConnection#commitメソッドやStatement#closeを呼び出す必要があります。「とりあえずcloseしとけば良いよね」という考え方ではダメです。リソース管理を手抜きするとバグの元になります。
プーリングされたコネクションを解放するにはBasicDataSource#closeメソッドを呼び出します。アプリケーション終了前や接続を明示的にリセットしたい時に使います。