- PR -

マルチスレッド環境でのDBアクセスについて

1
投稿者投稿内容
にゃんこ
会議室デビュー日: 2003/07/06
投稿数: 4
投稿日時: 2008-09-04 17:39
現在、おおよそ以下のような作りになっているアプリケーションがあります。

=================================
public class A {
private static DataSource dsL
 private Connection con ;

public dbConnection() {
con = null;
con = dsL.getConnection();
・・・
=================================
上記のようにConnectionオブジェクトをインスタンス変数として持ってしまうと、
このクラスを使用するリクエストが複数同時にあった場合、
正しいConnectionが取れなくなるという結果を期待していて、
負荷ツールで複数リクエストを同時に送ってみたところ、
実際にトレースを取得して値を見てみるとちゃんとそれぞれ異なるConnectionオブジェクトを取得していました。

"private"となっているからスレッドセーフなのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2008-09-04 18:02
コードの断片からはわかりませんが、複数のスレッドが同じ A クラスのインスタンスの dbConnection() メソッドにアクセスした場合は次から次へと異なるコネクションが con 変数に代入されることになります。
#そしてコネクションは閉じられません・・・

スレッド毎に A クラスのインスタンスを複数作っているのでしょうか?
にゃんこ
会議室デビュー日: 2003/07/06
投稿数: 4
投稿日時: 2008-09-04 18:12
先ほどは記載し忘れてしまいましたが、
このアプリケーションはJ2EEのアプリケーションなので、
1リクエスト=1スレッドとなり、JVM上の初回アクセス時のみインスタンスが作成され、
個々のスレッドはインスタンスを共有で使うものと理解しています。


>dbConnection() メソッドにアクセスした場合は次から次へと異なるコネクションが con 変数に代入されることになります。

やはりそうですよね。
そうなることを期待していたのですが、
con = dsL.getConnection();の次の行に
System.out.println()でConnectionの値を出力させると、
なぜかそれぞれのスレッドが異なる値(Connection@xxxxx)を取得しているのです・・・。

javaのAPIなどで、
1スレッドごとにインスタンスが生成されているか、
もしくは共有利用されているかどうかを確認するような方法はないでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2008-09-04 18:24
>con = dsL.getConnection();の次の行に
>System.out.println()でConnectionの値を出力させると、
>なぜかそれぞれのスレッドが異なる値(Connection@xxxxx)を取得しているのです・・・。
毎回 データソースから getConnection() を呼び出していますで、異なるコネクションが得られるのは期待通りです。

既に実行中のスレッドからもその新しいコネクションを参照することになりますのでおかしい作りですね。
1

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