[Seasar-user:18265] [S2DBCP,S2DAO] DB(Oracle側)のエラーでコネクションクローズに至った場合再取得について

尾藤 浩嗣 [E-MAIL ADDRESS DELETED]
2009年 8月 12日 (水) 18:49:40 JST


びとうと申します。

S2DAOを使っている場合の、DBとのコネクションの管理について質問です。

環境は、WebSphere 6.1, Oracle 11g, s2-dao-1.0.48, S2.3.23 を使っています。

j2ee.dicon では、
<component name="xaDataSource"
	class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
	<property name="driverClassName">
		"oracle.jdbc.driver.OracleDriver"
	</property>
	<property name="URL">
		"jdbc:oracle:thin:@hostname1521:servicename"
	</property>
	<property name="user">"username"</property>
	<property name="password">"password"</property>
</component>
と設定しています。

コネクションプールの使われ方としては、
  http://ml.seasar.org/archives/seasar-user/2007-July/009343.html
と概ね理解していますが、DAOメソッドを呼び出したした結果として、
Oracle側の内部エラーが起因で、

  SQLException I/O例外です。パイプが切断されました。
  SQLException クローズされた接続です。

という例外が返ってくることがあります(通常はないのですが、稀に)。

S2DAOだけでなく、DBCPに関連するかもしれませんが、DBとのコネクション
が上記の様に例外によりクローズした場合、DBCPやS2DAOは、その
JDBC Connectionのインスタンスをこれ以上使用できないものとして
いつかのタイミングで解放する動作をするでしょうか?

それとも、クローズされた接続のJDBC Connectionのインスタンスとは
認識せずに、(アイドルとして設定時間経過しない限り)解放しない
のでしょうか?

という質問について、(私が誤って、s2dao-dev に出してしまったのですが、
そちらの方より)

「S2DBCPは、Connectionのメソッド呼び出しで例外が発生した場合、
  そのConnectionをプールに戻さず、ただちにクローズしています。
  そのため、そのConnectionは2度と利用されません。
  クローズされたかどうかは
  例外がスローされる直前で「物理的なコネクションを閉じました」
  といったメッセージがログに出力されるかどうかでわかります。」

との回答を頂きました。

「物理的なコネクションを閉じました」というログが出ているかどうかは、
ごく稀に発生する事象で、ログレベルを INFOにしていたため残念ながら
残っていない状況です。

質問させて頂きたいのは、

  SQLException I/O例外です。パイプが切断されました。
  SQLException クローズされた接続です。

という例外が発生したのは、S2DAOを用いて(内部的にはPreparedStatement
が使われていると認識しています)DML文を発行した結果でした。
つまり、Connectionのメソッド呼び出しではなく、PreparedStatementの
メソッド呼び出し時の例外に対し、S2DBCPは、Connectionをクローズする
でしょうか?

宜しくお願いします。

-以上-


Seasar-user メーリングリストの案内