- PR -

webアプリが数時間後に勝手におかしくなる

投稿者投稿内容
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-10-18 14:43
引用:

takeさんの書き込み (2004-10-18 14:27) より:
結局のところ、それに戻した方がいまのところ無難ということでしょうか。コネクションプールはもうちょっとわかってきてから使ってみたいと思います。


いいえ、既にコネクションプールの仕組みは自分で作らなくてもコンテナ(この場合はTomcat
ですね)が通常提供していますので、それを使えばいいだけです。もし時間があれば、以下を
読んで挑戦してみてください。

http://jakarta.apache.org/tomcat/tomcat-5.0-doc/jndi-datasource-examples-howto.html
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2004-10-18 15:24
引用:

takeさんの書き込み (2004-10-18 14:27) より:
今後のためにもログを取るしくみを作りたいのですが、上記のクラスを使うとして、YOU@ITさんのおっしゃるような方法を取ることは可能でしょうか?




con=DriverManager.getConnection(url,user,pass);

この部分を、

コード:
 :
con = new ConnectionWrapper(DriverManager.getConnection(url,user,pass));
 :

class ConnectionWrapper implements Connection {
 private static int ids = 0;
 private final Connection conn;
 private final int id;
 public ConnectionWrapper(Connection conn) {
  this.conn = conn;
  this.id = ids++;  // このままではスレッドセーフでないので注意
  System.out.println("Connection"[ + id + "] open.");
 }
 public void close() throws SQLException {
  conn.close();
  System.out.println("Connection[" + id + "] close.");
 }
 /* その他メソッドも同様に、connに処理を委譲 */
}


のようにすれば良いかと思います。

あと、DbConnectクラスでConnectionを保持するのはわかりますが、
Statementまで保持するのは良くないと思います。
この手のリソースは、使う直前で確保して、使い終わったら即開放が基本です。
今のDbConnectだと、いつ使われるかわからないStatementをあらかじめ
確保しているわけで、リソース消費の面からみてよくないと思いますよ。

ついでに、ResultSet、Statement、Connectionのクローズは、
個々にtry〜catchで囲った方が良いかと思います。
holic
ベテラン
会議室デビュー日: 2004/08/24
投稿数: 74
投稿日時: 2004-10-18 22:06
コード:
try{
    コネクションを取得して、操作する処理
} catch {
    例外処理
} finally {
    コネクションを開放する処理
}



という形で書いておかないと、開放もれをしますよ。
必要に応じて、さらに処理を try-catch でくくっておいてください。

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