- PR -

JBOSS3.2.5 DataSourceからコネクションの取得に失敗します。

1
投稿者投稿内容
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-18 14:12
j2sdk1.4.2_07
jboss3.2.5
eclipse3.0.1
oracle 9i
を使っています。
jbossのJNDIを利用してDataSourceを取得後、コネクションまわりで妙な例外が発生して
落ちてしまいます。

[CachedConnectionManager] Closing a connection for you. Please close them yourself: org.jboss.resource.adapter.jdbc.WrappedConnection@477b4e

対処方法が解らずいきづまっているところです。どなたかご存知のかたがいらっしゃいましたら情報をください。よろしくお願いいたします。

Hyde
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-05-18 14:14
コネクションを適切にクローズしていないので、finalize メソッドでガベージコレクションのタイミングで自動的にクローズされているのではないでしょうか。
"Please close them yourself" というメッセージの通り、自分でクローズするようにしましょう。
finally ブロックで。
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-18 14:39
補足:ソース
// ===================================================================
InitialContext context = null;
DataSource ds = null;
ResultSet rs = null;
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
try{
context = new InitialContext();
System.out.println("■コンテクストの取得:1:" + context);
ds = (DataSource)context.lookup(DSNAME);
System.out.println("■データソースの取得:1:" + ds);
conn = ds.getConnection();
System.out.println("■コネクションの取得:2:" + conn);
String sql = "select OPE_ID,PASSWORD,OPE_NAME from OPE_INF where OPE_ID='" + txtOpeId + "' and PASSWORD='" + txtPassword + "'";
pstmt = conn.prepareStatement(sql);
System.out.println("■prepareStatementの取得:2:" + pstmt);
rs = pstmt.executeQuery();
System.out.println("■ResultSetの取得:" + rs);
         //この後抽出作業・・・

}catch(NamingException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}finally{
rs.close();
pstmt.close();
stmt.close();
conn.close();
}
// ===================================================================

一応 finally でクローズしています。
デバッグをみるとrs = pstmt.executeQuery();で落ちてるようなのですが(■prepareStatementの取得までは出力されているので)、スタックとレースは、それより前のconn = ds.getConnection();をさしています。(ここらへんもなぜなのかわからないのですが・・・)

13:14:13,214 INFO [STDOUT] ■データソースの取得:2:org.jboss.resource.adapter.jdbc.WrapperDataSource@e0eb3f
13:14:14,405 INFO [STDOUT] ■コネクションの取得:2:org.jboss.resource.adapter.jdbc.WrappedConnection@fbca58
13:14:14,466 INFO [STDOUT] ■prepareStatementの取得:2:org.jboss.resource.adapter.jdbc.WrappedPreparedStatement@1d4179
13:14:14,506 INFO [CachedConnectionManager] Closing a connection for you. Please close them yourself: org.jboss.resource.adapter.jdbc.WrappedConnection@fbca58
java.lang.Exception: STACKTRACE
at org.jboss.resource.connectionmanager.CachedConnectionManager.registerConnection(CachedConnectionManager.java:285)
at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:525)
at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:887)
at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:102)
at fec.sb.main.FecEntranceBean.checkAuthority(FecEntranceBean.java:135)
at fec.sb.main.FecEntranceBean.sub_execute(FecEntranceBean.java:98)


ところで、コネクションを勝手に落とそうとJBOSSがしていて、それに失敗し、その状態でexecuteQueryを発行するから例外が発生していると読めるのですが、私はまだこのタイミングではコネクションを閉じたくはないわけです。作業が終わっていないので。

で、どういうことなのかが解らないでいます。Poolも絡んでいるものと思えるのですが。どうすればよいのかが検討がつきません。

PS:インギ」さん即レスありがとうございます!
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-05-18 15:33
rs = pstmt.executeQuery();

で例外が発生していたら、rs は null ですから rs.close() のところで NullPointerException が発生してコネクションはクローズされませんね。
あと InitialContext もクローズし忘れているようです。

[ メッセージ編集済み 編集者: インギ 編集日時 2005-05-18 15:37 ]
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-18 16:04
ありがとうございます!そのとおりでした。finally をはしょったのが原因でした。
結局finally句で例外が発生しており、そこで正しくキャッチせずにスローですませていたために気づかなかったようです。閉じ忘れのコネクションが原因でCachedConnectionManagerが作動してコネクションを閉じようとしてあのようなメッセージがでていたようです。勉強になりました。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)