- - PR -
コネクションが閉じられる・・・?
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-04-11 20:06
現在、Strutsを使用してWebアプリを作成していますが、よくわからないエラーによって、対処に困っています。わかる方がいらっしゃいましたら、教えてください。
まず、1つのアクションに対して、二人で同時接続をする。(この時点ではデータベースに接続するため、二人ともコネクションを取得します。) 次に、一方の処理が終わってコネクションを閉じると、もう一方の人もそれに合わせてコネクションを閉じられた状態になってしまうため、二人目は「Connection is closed.」とSQLExceptionになってしまいます。 複数の人が同じアクションに同時接続をしても、Connectionを別々に持つことって不可能なのでしょうか。 また、ConnectionPoolingについてもよくわからないので、これらについてアドバイスをお願いします。 [ メッセージ編集済み 編集者: ノヴァ 編集日時 2006-04-11 20:07 ] | ||||||||||||||||
|
投稿日時: 2006-04-11 20:14
それは単に作りが悪いだけだと思います。
Connectionオブジェクトを静的変数かインスタンス変数にしていませんか? | ||||||||||||||||
|
投稿日時: 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 ] | ||||||||||||||||
|
投稿日時: 2006-04-11 21:00
このクラスが利用側からどのように呼び出されているかわからないのですが、以下のように
変更してみたらどうなりますか?
それが本当ならSQLExceptionではなくNullPointerExceptionになるのではないかと思うの ですが、どうやって確認していますか? | ||||||||||||||||
|
投稿日時: 2006-04-12 10:21
ukさん、返信ありがとうございます。
現在Eclipseを使用して、Connectionオブジェクトの値をデバッグで追ってるのですが、 最初の処理が動いている間は、「org.apache.commons.dbcp.PoolableConnection@50a492」という値になっていたのですが、最初の処理がConnection#close()を行った後は、二番目の処理のConnectionの値が「null」と表示されていたので、Connectionがnullなのだと思っております。 1つのアクションに対して同時アクセスをしても、取得するConnectionまで共通で使われることはないと思いますので、何か良い解決方法がありましたら教えてください。 また、
は、このprivate変数を同クラス内のメソッドでも使用しているため、getConnection()メソッドの中に入れることはできませんでした。 [ メッセージ編集済み 編集者: ノヴァ 編集日時 2006-04-13 21:15 ] | ||||||||||||||||
|
投稿日時: 2006-04-12 11:02
それはgetConnectionメソッドから値を受け取った時点でですか? getConnectionメソッドが正常に動作しているのであれば、そんなことはないと思うのですが。
だからそれはコーディング次第です。「コネクションを取得するクラス」の実装を見る限り、 誤ったコーディングをしている可能性は十分にありそうに思います。
private変数は他のメソッドではなんのために使用しているのですか? あくまで可能性ですが、private変数がそのほかのメソッドで書き換えられている可能性も あります。以下のようにメソッドを書き換えてみたらどうなりますか? #よく見ると前の私のコードはコンパイル通らないですね
| ||||||||||||||||
|
投稿日時: 2006-04-12 11:19
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」になってしまうため、エラーとなってしまうのです。
上記の方法も試しましたが、結果は同じでした。 また、private変数は下記のように同じクラス内で使用しています。
[ メッセージ編集済み 編集者: ノヴァ 編集日時 2006-04-13 21:13 ] | ||||||||||||||||
|
投稿日時: 2006-04-12 11:25
では、このデータベース接続クラスをActionクラスからはどのように利用しているのですか?
#データベース接続クラスのコーディングについては疑問がありますが、まず現在の問題が #片付いてからにしましょう |