- ベストアンサー
JavaサーブレットからのOracle接続エラーについて
- JavaサーブレットからOracleに接続する際に発生したエラーについて解決方法を教えてください。
- JavaサーブレットからOracleに接続しようとする際に起こるエラー「java.sql.SQLRecoverableException: クローズされた接続です。」の解決方法について教えてください。
- JavaサーブレットからのOracle接続エラーが発生し、エラーメッセージは「java.sql.SQLRecoverableException: クローズされた接続です。」です。どのように解決すればよいでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
試しにfinally以外でcloseしてみて。
その他の回答 (2)
- askaaska
- ベストアンサー率35% (1455/4149)
#1さんに追記で どこでエラーが起きているのかが分からないので それも書いてもらえないかしら?
お礼
ご回答ありがとうございます。 プログラムとエラー発生箇所について補足入力致しました。 よろしくお願い致します。
補足
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ DB db= null; ResultSet rs = null; try { db= new DB(strDriver,strJdbcPrefix,strHostName,strUserName,strPassWord,strDbName); //DBへ接続 db.dbAccess(); //パラメータ取得 String[] Parameter = new String[3]; Parameter[0] = request.getParameter("no"); no = null; tel = null; address = null; //パラメータチェック用 boolean pramErrFlag = false; //No.取得用 String machin = null; String rtnPram1 = null; String rtnPram2 = null; //パラメータが、No.の場合 if (Parameter[0] != null && Parameter[0].length() != 0 && Parameter[0].length() == 12){ no = Parameter[0]; //テストマスタ件数チェック switch(selectCntMstTest(rs,db)){ case 1: //パラメータ正常 pramErrFlag = true; machin = selectMstTest(rs,db); rtnPram1 = machin; rtnPram2 = "0"; break; case 0: //「パラメータエラー(該当Noなし)」のパラメータを設定する。 rtnPram1 = Parameter[0]; rtnPram2 = "2"; break; default: //「パラメータエラー(該当No複数存在)」のパラメータを設定する。 rtnPram1 = Parameter[0]; rtnPram2 = "1"; } } //パラメータエラーの場合 if (pramErrFlag != true){ //バッチファイル起動 String command = "/home/test/bin/test.bat " + rtnPram1 + " " + rtnPram2; Runtime runtime = Runtime.getRuntime(); runtime.exec(command); response.setStatus(HttpServletResponse.SC_BAD_REQUEST); }else{ //バッチファイル起動 String command = "/home/test/bin/test.bat " + rtnPram1 + " " + rtnPram2; Runtime runtime = Runtime.getRuntime(); runtime.exec(command); response.setStatus(HttpServletResponse.SC_OK); } } catch (Exception e) { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); e.printStackTrace(); logger.error(e); } finally { try{ db.dbClose(); ●●●●問題発生箇所 }catch (Exception e) { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); e.printStackTrace(); } }
- yamada_g
- ベストアンサー率68% (258/374)
記載のコードだけでは、実際にどこでcloseをしているのかが分からないので 例外が発生するcloseより前にどこかでcloseしているのではとしか言いようがない気がします。 ログなどを仕込んで確認してみてはいかかでしょうか。
お礼
ご回答ありがとうございます。 ログに出力して確認したいと考えては、いるのですがコネクションの状態等をどのようにしたら出力できるかがわからなくて困っております。 出力方法をご存知でしたら教えて頂けますでしょうか。 よろしくお願い致します。
補足
isClosed()で調べることが、できました。 DBアクセス時、sql発行時、DBクローズ時の前で調べましたが、クローズはしていませんでした。。。
お礼
ご回答ありがとうございます。 finally以外でcloseしてみたのですが、同様の結果となりました。 その後、色々調査した結果、ステートメントのcloseができてないことが原因であることが、わかりました。 皆様、ご協力ありがとうございました。