- - PR -
JBOSS3.2.5 DataSourceからコネクションの取得に失敗します。
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 |
|
投稿日時: 2005-05-18 14:14
コネクションを適切にクローズしていないので、finalize メソッドでガベージコレクションのタイミングで自動的にクローズされているのではないでしょうか。
"Please close them yourself" というメッセージの通り、自分でクローズするようにしましょう。 finally ブロックで。 |
|
投稿日時: 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:インギ」さん即レスありがとうございます! |
|
投稿日時: 2005-05-18 15:33
rs = pstmt.executeQuery();
で例外が発生していたら、rs は null ですから rs.close() のところで NullPointerException が発生してコネクションはクローズされませんね。 あと InitialContext もクローズし忘れているようです。 [ メッセージ編集済み 編集者: インギ 編集日時 2005-05-18 15:37 ] |
|
投稿日時: 2005-05-18 16:04
ありがとうございます!そのとおりでした。finally をはしょったのが原因でした。
結局finally句で例外が発生しており、そこで正しくキャッチせずにスローですませていたために気づかなかったようです。閉じ忘れのコネクションが原因でCachedConnectionManagerが作動してコネクションを閉じようとしてあのようなメッセージがでていたようです。勉強になりました。ありがとうございました。 |
1