- PR -

コネクションが閉じられる・・・?

投稿者投稿内容
ノヴァ
会議室デビュー日: 2006/03/31
投稿数: 14
投稿日時: 2006-04-11 20:06
現在、Strutsを使用してWebアプリを作成していますが、よくわからないエラーによって、対処に困っています。わかる方がいらっしゃいましたら、教えてください。

まず、1つのアクションに対して、二人で同時接続をする。(この時点ではデータベースに接続するため、二人ともコネクションを取得します。)
次に、一方の処理が終わってコネクションを閉じると、もう一方の人もそれに合わせてコネクションを閉じられた状態になってしまうため、二人目は「Connection is closed.」とSQLExceptionになってしまいます。

複数の人が同じアクションに同時接続をしても、Connectionを別々に持つことって不可能なのでしょうか。
また、ConnectionPoolingについてもよくわからないので、これらについてアドバイスをお願いします。

[ メッセージ編集済み 編集者: ノヴァ 編集日時 2006-04-11 20:07 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-04-11 20:14
それは単に作りが悪いだけだと思います。
Connectionオブジェクトを静的変数かインスタンス変数にしていませんか?
ノヴァ
会議室デビュー日: 2006/03/31
投稿数: 14
投稿日時: 2006-04-11 20:50
コネクションを取得するクラスの中身は下記です。
=============================================================
private Connection m_oConnection = null;
public Connection getConnection() throws Exception {

InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/xxx");
m_oConnection = ds.getConnection();

return m_oConnection;

}
=============================================================
接続プーリングの機能として、DataSourceのメソッドgetConnectionが
呼び出されると、Connectionを接続プール中から1つ取り出してjavaへ
渡し、javaプログラムでConnectionのメソッドcloseが呼び出されると、
データベースとの接続を維持したままConnectionを接続プールに返却する
と思うのですが、Connectionを接続プールに返却するとConnectionオブジェクトは
nullになってしまうのですか?
現在、Connectionがnullになっているために、エラーが発生しています。

[ メッセージ編集済み 編集者: ノヴァ 編集日時 2006-04-13 21:14 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-04-11 21:00
このクラスが利用側からどのように呼び出されているかわからないのですが、以下のように
変更してみたらどうなりますか?
コード:
  //private Connection m_oConnection = null;
  public Connection getConnection() throws Exception {

    private Connection m_oConnection = null;
    InitialContext ic = new InitialContext();
    DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/pca");
    m_oConnection = ds.getConnection();

    return m_oConnection;

  }



引用:

現在、Connectionがnullになっているために、エラーが発生しています。


それが本当ならSQLExceptionではなくNullPointerExceptionになるのではないかと思うの
ですが、どうやって確認していますか?
ノヴァ
会議室デビュー日: 2006/03/31
投稿数: 14
投稿日時: 2006-04-12 10:21
ukさん、返信ありがとうございます。

引用:

それが本当ならSQLExceptionではなくNullPointerExceptionになるのでは
ないかと思うのですが、どうやって確認していますか?


現在Eclipseを使用して、Connectionオブジェクトの値をデバッグで追ってるのですが、
最初の処理が動いている間は、「org.apache.commons.dbcp.PoolableConnection@50a492」という値になっていたのですが、最初の処理がConnection#close()を行った後は、二番目の処理のConnectionの値が「null」と表示されていたので、Connectionがnullなのだと思っております。

1つのアクションに対して同時アクセスをしても、取得するConnectionまで共通で使われることはないと思いますので、何か良い解決方法がありましたら教えてください。


また、
引用:

このクラスが利用側からどのように呼び出されているかわからないのですが、以下のように変更してみたらどうなりますか?
コード:
-------------------------------------------------------------------------------
//private Connection m_oConnection = null;
public Connection getConnection() throws Exception {

private Connection m_oConnection = null;
InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/xxx");
m_oConnection = ds.getConnection();

return m_oConnection;

}


-------------------------------------------------------------------------------


は、このprivate変数を同クラス内のメソッドでも使用しているため、getConnection()メソッドの中に入れることはできませんでした。




[ メッセージ編集済み 編集者: ノヴァ 編集日時 2006-04-13 21:15 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-04-12 11:02
引用:

現在Eclipseを使用して、Connectionオブジェクトの値をデバッグで追ってるのですが、
最初の処理が動いている間は、「org.apache.commons.dbcp.PoolableConnection@50a492」という値になっていたのですが、最初の処理がConnection#close()を行った後は、二番目の処理のConnectionの値が「null」と表示されていたので、Connectionがnullなのだと思っております。


それはgetConnectionメソッドから値を受け取った時点でですか?
getConnectionメソッドが正常に動作しているのであれば、そんなことはないと思うのですが。

引用:

1つのアクションに対して同時アクセスをしても、取得するConnectionまで共通で使われることはないと思いますので、何か良い解決方法がありましたら教えてください。


だからそれはコーディング次第です。「コネクションを取得するクラス」の実装を見る限り、
誤ったコーディングをしている可能性は十分にありそうに思います。

引用:

は、このprivate変数を同クラス内のメソッドでも使用しているため、getConnection()メソッドの中に入れることはできませんでした。


private変数は他のメソッドではなんのために使用しているのですか?
あくまで可能性ですが、private変数がそのほかのメソッドで書き換えられている可能性も
あります。以下のようにメソッドを書き換えてみたらどうなりますか?
#よく見ると前の私のコードはコンパイル通らないですね

コード:
  public Connection getConnection() throws Exception {

    InitialContext ic = new InitialContext();
    DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/pca");
    return ds.getConnection();

  }


ノヴァ
会議室デビュー日: 2006/03/31
投稿数: 14
投稿日時: 2006-04-12 11:19
引用:

それはgetConnectionメソッドから値を受け取った時点でですか?
getConnectionメソッドが正常に動作しているのであれば、そんなことはないと思うのですが。


getConnectionメソッドから値を受け取った後の話です。
ちなみに、最初の処理がgetConnectionメソッドで受け取った値が、
「org.apache.commons.dbcp.PoolableConnection@431693」で、
次の処理がgetConnectionメソッドで受け取った値が、
「org.apache.commons.dbcp.PoolableConnection@7c28c」だった場合、
「org.apache.commons.dbcp.PoolableConnection@7c28c」が先にConnection#close()されて、「org.apache.commons.dbcp.PoolableConnection@431693」の値が「null」になってしまうため、エラーとなってしまうのです。

引用:

コード:
--------------------------------------------------------------------------------

public Connection getConnection() throws Exception {

InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/xxx");
return ds.getConnection();

}


--------------------------------------------------------------------------------


上記の方法も試しましたが、結果は同じでした。

また、private変数は下記のように同じクラス内で使用しています。
コード:

データベースコネクション取得クラス
public class DaoUtil implements Serializable {

private Connection m_oConnection = null;

public Connection getConnection() throws Exception {
InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/xxx");
m_oConnection = ds.getConnection();
return m_oConnection;
}

public void commit() throws Exception {
m_oConnection.commit();
}

public void rollback() throws Exception {
m_oConnection.rollback();
}

}



[ メッセージ編集済み 編集者: ノヴァ 編集日時 2006-04-13 21:13 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-04-12 11:25
では、このデータベース接続クラスをActionクラスからはどのように利用しているのですか?

#データベース接続クラスのコーディングについては疑問がありますが、まず現在の問題が
#片付いてからにしましょう

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