[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 メーリングリストの案内