ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Javaのコネクションプーリングの仕組み

Javaのコネクションプーリングがどのような仕組みになっているのか、知らない人は結構多いんじゃないかと思います。
Slim3のコネクションプーリングの実装を見ると、この辺が理解できるようになります。トランザクションとコネクションプーリングがどのように連携しているかを把握することは重要です。
http://svn.slim3.org/browse/trunk/slim3/slim3-datasource/src/main/java/org/slim3/datasource/


登場人物は、4人しかいないから簡単ですね。


最初に見て欲しいのは、ConnectionWrapper。DataSource.getConnection()したときに戻されるコネクションの実態です。このコネクションを論理的なコネクションと呼ぶようにします。
主な役割は、コネクションがクローズされたときに、コネクションをプールに返すこと。プールに返されるコネクションは、物理的な(DriverManagerから取得された)Connectionではなく、XAConnectionになります。


XAConnectionImplがXAConnectionの実装クラスです。
ポイントは、コネクションがクローズされたとき(notifyConnectionClosedメソッドが呼び出されたとき)に、ConnectionEventListener#connectionClosed()を呼び出すこと。
コネクションプーリングを実装しているクラスは、ConnectionEventListenerインターフェースを実装して、クローズされたときに、XAConnectionをプールに戻します。
もう一つのポイントが、XAResourceの実装オブジェクトを持っていること。このXAResourceは、トランザクションに登録され、commitやrollbackの時に呼び出されます。


XAResourceImplがXAResourceの実装クラスです。
ポイントは、start,commit, rollbackメソッド。
startメソッドは、このオブジェクトがトランザクションに登録されたときに呼び出されます。このときにやっているのは、物理的なConnectionのautoCommitをfalseにすること。
commit、rollbackメソッドは、トランザクションがcommit,rollbackするタイミングで呼び出されます。やっていることは、物理的なConnectionのcommit,rollbackメソッドを呼び出した後に、autoCommitをtrueにもどすことです。
このXAResourceImplによって、トランザクションとコネクションが連動しているのです。


最後が、XADataSourceImpl。コネクションプールの実装です。
getConnection,getXAConnectionを最初に読むといいでしょう。コネクションをプールから取り出す部分が理解できます。
connectionClosedメソッドは、ConnectionEventListenerのメソッドで、ここでXAConnectionをプールに戻しています。


以上で、コネクションプーリングの仕組みの説明はおしまい。そんなに難しくなかったでしょ。インターナルな仕組みを理解するのは楽しいよね。
これで、Seasar2に相当する部分の実装は完了。これから、SAStrutsをSlim3に移植します。