dポイントプレゼントキャンペーン実施中!

お世話になります。

javaサーブレットからoracleに接続する際、以下のエラーが発生して困っております。
エラー:java.sql.SQLRecoverableException: クローズされた接続です。

解決するための情報を頂けますでしょうか。

私がテストしている環境は、以下となります。

【Webサーバ】
centOS5.5.
jdk1.6
tomcat5.5

【DBサーバ】
centOS5.5.
oracle10g r2

jdbcドライバーは、ojdbc6.jarを使用しております。
サーブレット起動時にDB接続し処理完了時にDBクローズしていますが、DBクローズ処理にて
上記エラーが、発生してしまいます。
DB接続及びDBクローズは、以下のようにプログラミングしております。
/**
* 概要 : DBアクセス
* 処理 : DBアクセス
*/
public void dbAccess() throws Exception {
conn = null;

try {
DriverManager.setLogWriter(new PrintWriter(System.out));

Class.forName(driver);

conn = DriverManager.getConnection(
jdbcPrefix + hotname + dbname,
username,password);
// 自動コミット・モードを設定(手動コミット)
conn.setAutoCommit(false);

}catch (SQLException e) {
throwe;
}catch (Exception e) {
throwe;
}
}


/**
* 概要 : DBクローズ
* 処理 : DBを閉じます。
*/
public void dbClose() throws Exception {

try {
if (conn != null)
conn.close();
}catch (Exception e) {
throwe;
}

}


お手数お掛け致しますが、ご教授宜しくお願い致します。

A 回答 (3件)

試しにfinally以外でcloseしてみて。

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

finally以外でcloseしてみたのですが、同様の結果となりました。
その後、色々調査した結果、ステートメントのcloseができてないことが原因であることが、わかりました。

皆様、ご協力ありがとうございました。

お礼日時:2011/03/29 19:24

#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();
}
}

補足日時:2011/03/28 18:18
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
プログラムとエラー発生箇所について補足入力致しました。

よろしくお願い致します。

お礼日時:2011/03/28 18:17

記載のコードだけでは、実際にどこでcloseをしているのかが分からないので


例外が発生するcloseより前にどこかでcloseしているのではとしか言いようがない気がします。
ログなどを仕込んで確認してみてはいかかでしょうか。

この回答への補足

isClosed()で調べることが、できました。
DBアクセス時、sql発行時、DBクローズ時の前で調べましたが、クローズはしていませんでした。。。

補足日時:2011/03/28 21:52
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ログに出力して確認したいと考えては、いるのですがコネクションの状態等をどのようにしたら出力できるかがわからなくて困っております。
出力方法をご存知でしたら教えて頂けますでしょうか。

よろしくお願い致します。

お礼日時:2011/03/28 18:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!