- PR -

DataSourceの扱いについて

投稿者投稿内容
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-11-05 17:52
引用:

ぷかりんさんの書き込み (2003-11-05 17:22) より:
そうすると、lookupの回数はrequestが発生した
回数となるので各メソッドでlookupするより
パフォーマンス的に良いということであっていますか?


 違います。
ServletのinitメゾットはServletが呼ばれた初回のみ実効されるだけです。
※destroyが実行されてインスタンスが破棄されれば、また実行されます。

[ メッセージ編集済み 編集者: taku 編集日時 2003-11-05 18:04 ]
ふかまち
会議室デビュー日: 2001/08/06
投稿数: 9
お住まい・勤務地: 芭蕉 結びの地
投稿日時: 2003-11-05 18:03
そうでした。基本も忘れていました。すみません。

Servletのinit()で取得したdatasourceは
どこに保持することになるのでしょうか。

ServletContext等ということになるのでしょうか。
そうした場合、とまとさんのご指摘の
Web層とビジネスロジック層が密接になるのは
datasourceのlookupを毎回行うよりは
そうした方が良いということになるのでしょうか。
とまと
ベテラン
会議室デビュー日: 2003/10/18
投稿数: 51
投稿日時: 2003-11-05 22:01
こんばんは。

引用:

takuさんの書き込み (2003-11-05 17:03) より:
 これは明らかな誹謗中傷ではないでしょうかね。


誰に対する誹謗中傷なのでしょうか?

引用:

EJBを使っていて、DataSourceを使用しますか?


逆に使ってはいけないのですか?
BMP Entity Beanを作成する場合、
DataSourceをJNDIからlookupしてはいけないのでしょうか?

引用:

ぷかりんさんは、JNDI自体について質問されていますか?


質問されていると認識しています。
毎回ルックアップするよりも、DataSourceを
キャッシングする方がよいと思うけどどうなのだろうか?
というのがぷかりんさんの質問内容ではないでしょうか?

引用:

 JNDIからルックアップするには時間がかかるから、
毎回行うとパフォーマンスが悪くなります。
だから、Servletのinitでやるんです。


initでやっても別に構いませんが、
必ずしもinitでやらなくてもよいのではないでしょうか?
そもそもサーブレットを利用しないシステムでは
どうするのでしょうか?
ぷかりんさん自身が記述している方法ではだめなのでしょうか?

引用:

ちなみに、某I○M社の講習用のテキストでもそうなってましたよ。
(以前、仕事で同社のSEから資料として渡されたものです)


その資料に書かれているから、
サーブレットのinitでやるのが「普通」ということなのでしょうか?

以上
とまと
ベテラン
会議室デビュー日: 2003/10/18
投稿数: 51
投稿日時: 2003-11-05 22:28
こんばんは。

引用:

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



私の場合、社内のデータベースアクセスフレームワーク
(OR Mapper)を使用したケースが多いため、
DataSourceを意識することはほとんどありませんでした。
何が「普通」で何が「普通でない」というのは
ともかく、
もし私が同じ問題を解決するとしたら、
ぷかりんさんと同様な方法を取るように思います。
ただ、この方式でどれだけのパフォーマンスの向上になるのか、
また何か問題があるのかは正直わかりません。
しかし、こうやってデータベース接続を取得するインターフェイス
を決めたり、局所化しておけば、問題が発生した場合、
他への影響が少なく、対処しやすいと思います。

以上です。
syo
常連さん
会議室デビュー日: 2003/08/17
投稿数: 43
投稿日時: 2003-11-05 23:02
お世話になっております。

引用:

Servletのinit()で取得したdatasourceは
どこに保持することになるのでしょうか。



私は、コネクションプーリングを管理するクラスを作成し、
そのクラスのstatic変数としてdatasourceを保持しています。
このクラスにはconnectなどのメソッドを準備しておき、
SQLを使用する際にはそのメソッド経由でConnectionを取得しています。
Keisuke
大ベテラン
会議室デビュー日: 2003/10/24
投稿数: 105
投稿日時: 2003-11-06 01:47
IBM(伏字は必要はないですよね?)は、Servlet init での
キャッシングを薦めています。

http://www-6.ibm.com/jp/software/websphere/developer/bpz/13.html

DataSource を動的に変更しなくてはならないシステムは極まれと
思われるので、正論かな。
とまと
ベテラン
会議室デビュー日: 2003/10/18
投稿数: 51
投稿日時: 2003-11-06 02:37
こんばんは

引用:

Keisukeさんの書き込み (2003-11-06 01:47) より:
IBM(伏字は必要はないですよね?)は、Servlet init での
キャッシングを薦めています。

http://www-6.ibm.com/jp/software/websphere/developer/bpz/13.html

DataSource を動的に変更しなくてはならないシステムは極まれと
思われるので、正論かな。



なるほど。
この記事を読むと、
Servletのinitメソッドはインスタンス化時に1回しか呼ばれないので
DataSourceを取得し、キャッシングするタイミングとしては
良いという点を述べていて
この点については全く異論はありません。

ただ、この情報だけでは、ぷかりんさんや私が疑問に思っている
サーブレットで取得したDataSourceを
どうやって業務ロジック層で利用するのかという点について
フォーカスされていないように思います。
この記事だけを読むと
サーブレットで取得したDataSourceを業務ロジック層に
パラメータ渡しするのだろうと想像してしまいます。。。

また、ぷかりんさんが提示したような方法でも、
一度だけJNDIをlookupし、DataSourceをキャッシュする
仕組みを実現できているように思います。
こちらの方法がServletで初期化する方法と比較して
よいと思うのは以下の点です。
・サーブレットから業務ロジック層にDataSourceを
 パラメータ渡しする必要がない。
 サーブレットは、業務ロジック層がどのような永続化を
 利用しているか全く関与する必要がない。
・例えば、Torqueなどの別の永続化機構に変更するような場合、
 Web層に影響を与えない。
・複数のサーブレットを利用し、それぞれのinitメソッドでDataSourceを
 取得する場合、コードが散在化する可能性がある。
※サーブレットのinitメソッドで、ぷかりんさんが提示されたようなクラスの
初期化コードを実行するようなケースはぷかりんさんの提示されたクラスを
利用することに該当するという認識です。

以上です。
ふかまち
会議室デビュー日: 2001/08/06
投稿数: 9
お住まい・勤務地: 芭蕉 結びの地
投稿日時: 2003-11-06 09:14
おはようございます。

皆様、貴重なご意見を有難うございます。

私が危惧していましたのは、lookupを毎回
行うことによる、実装の重複や、パフォーマンス
が悪くなるのではないかということでした。

皆様のご意見をお聞きしまして、やはり
毎回lookupするのはパフォーマンス的に
良くないのではないかと思いました。

各プログラムを作成する人たちがDataSource
を意識しなくてもよくなるようにも、なんらか
のクラスでラップする方向で行きたいと思います。

ありがとうございました。

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