- PR -

DataSourceの扱いについて

投稿者投稿内容
ふかまち
会議室デビュー日: 2001/08/06
投稿数: 9
お住まい・勤務地: 芭蕉 結びの地
投稿日時: 2003-11-05 14:41
いつもこの会議室で勉強させていただいています。

現在開発中のプロジェクトにおいて、
DataSourceを使用しているのですが、
DataSourceをJNDIからlookupしてくる処理を
どこに書くべきか迷っています。

現在はSQL文を実行するメソッド内で
ソース一部抜粋
コード:
InitialContext ic = new InitialContext();
DataSource ds;
Connection conn = null;
try {
    ds = (DataSource) ic.lookup("hogehoge");
    conn = ds.getConnection();
    ・・・・
}


という感じで各メソッドの中で毎回取得しています。
このメソッドからはSQLExceptionとNamingException
をthrowしています。


いま考えているのは以下の内容なのですが、

あるクラスAAAにstatic、finalな変数としてDataSourceを
定義して、各メソッドではそれを使用する。
コード:
public final class AAA {

   private static final DataSource dataSource;
   static {
      try {
          InitialContext ic = new InitialContext();
          ds = (DataSource) ic.lookup("hogehoge");
      } catch(NamingException e) {
          throw new RuntimeException(e);
      }
   }

   public static Connection getConnection() throws SQLException {
       return dataSource.getConnection();
   }
}


で各メソッドのConnection取得部分では
conn = AAA.getConnection();
とします。
これでSQLを実行するメソッドでの処理が少なくなり
NamingExceptionも投げなくてすむと考えています。

このような考え方はどうなのでしょうか。
皆様のご意見をいただければ幸いです。

また、皆様はどのようにDataSourceを扱われていますでしょうか?

よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-11-05 14:55
ServiceLocator というパターンが参考になるかもしれません。
http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-11-05 14:56
 DataSourceのルックアップは通常、initの中で行います。
ふかまち
会議室デビュー日: 2001/08/06
投稿数: 9
お住まい・勤務地: 芭蕉 結びの地
投稿日時: 2003-11-05 15:14
ご返事ありがとうございます。


>インギさん
パターンについては勉強不足でして、
これから勉強していきたいと思います。

>takuさん
init()メソッドはServletのinit()メソッドのことでしょうか。
その場合、lookupしたDataSourceはどこに保持されるのでしょうか。

勘違いがありましたらご指摘下さい。
ふかまち
会議室デビュー日: 2001/08/06
投稿数: 9
お住まい・勤務地: 芭蕉 結びの地
投稿日時: 2003-11-05 15:27

Service Locator パターンをざっと(ですが)
見てみました。

このパターンを用いた場合、SQLを実行するメソッドは
ServiceLocatorクラスに対してGetServiceメソッドを
呼び出し、ServiceLocatorはInitialContextの
lookupを呼び出すことになると思いますが、
そうなった場合、SQLを実行するメソッドで毎回lookupを
おこなうのと結果的には同じことになるのでしょうか。

lookupした結果のDataSouceを保持することに
あまり意味はないのでしょうか。

よろしくお願いします。
とまと
ベテラン
会議室デビュー日: 2003/10/18
投稿数: 51
投稿日時: 2003-11-05 16:35
こんばんは。

引用:

ぷかりんさんの書き込み (2003-11-05 15:14) より:

>takuさん
init()メソッドはServletのinit()メソッドのことでしょうか。
その場合、lookupしたDataSourceはどこに保持されるのでしょうか。



もしサーブレットのinitメソッドだったら、
ServletContextに格納するのだろうか?
もし業務ロジック層がServletContextから
DataSourceを取得するなら
Web層と密接に関連することになる。

それともサーブレットのインスタンス変数として保持するのだろうか?
その場合サーブレットから業務ロジックへデリゲートする時に
パラメータとしてDataSourceを渡すのだろうか?

せっかくJNDIを用いている意味は?
単にコネクションプーリングを利用するためだけということなのか?
業務ロジックがEJBで実装されている場合は?
普通はサーブレットのinitメソッドでやるのだろうか?
普通とは自分の周りではという意味なのだろうか?
いろいろと想像したら、何故か笑ってしまった^^
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-11-05 17:03
引用:

とまとさんの書き込み (2003-11-05 16:35) より:
こんばんは。
せっかくJNDIを用いている意味は?
単にコネクションプーリングを利用するためだけということなのか?
業務ロジックがEJBで実装されている場合は?
普通はサーブレットのinitメソッドでやるのだろうか?
普通とは自分の周りではという意味なのだろうか?
いろいろと想像したら、何故か笑ってしまった^^


 これは明らかな誹謗中傷ではないでしょうかね。
あなたが”笑ってしまった”って言われたらどう感じますか?
EJBを使っていて、DataSourceを使用しますか?
ぷかりんさんは、JNDI自体について質問されていますか?

 JNDIからルックアップするには時間がかかるから、
毎回行うとパフォーマンスが悪くなります。
だから、Servletのinitでやるんです。
ちなみに、某I○M社の講習用のテキストでもそうなってましたよ。
(以前、仕事で同社のSEから資料として渡されたものです)
ふかまち
会議室デビュー日: 2001/08/06
投稿数: 9
お住まい・勤務地: 芭蕉 結びの地
投稿日時: 2003-11-05 17:22
takuさん>
未熟者の私の為にお気遣いいただきありがとうございます。

takuさんのお書きになっている内容ですと、
Servletのinit()メソッドでlookupを行い
ビジネスロジックには取得したDataSourceを
渡すことになるのでしょうか。
(まちがっていたらすみません)
そうすると、lookupの回数はrequestが発生した
回数となるので各メソッドでlookupするより
パフォーマンス的に良いということであっていますか?

その場合、最初の文章で書かせていただきました
あるクラスAAAに持つというのは、各メソッドから
lookupするより良いことになると思いますが、
皆さんどう思われまでしょうか。


とまとさん>
とまとさんが普通と考えられている内容は
今の私には理解できていないのかもしれません。
できれば、とまとさんがDataSourceをどのように
あつかっておられるかをお聞かせ頂けないでしょうか。

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