- PR -

DBCPのDBセッションについて

投稿者投稿内容
タマ
ベテラン
会議室デビュー日: 2004/08/08
投稿数: 56
投稿日時: 2004-10-27 20:35
>かつのりさん
System.out.println(obj_cn.getClass().getClassLoader());
を実行したところnullが入っていたらしくエラーがでました。

>taipingさん
追加しましたがなにもおこりませんでした。

ちなみにTOMCATをアンインストールしてもう一度インストールしたところ
エラーが変わって
jdbc/oracleのコンテキストにバインドできない

というものになってしまいました。
kito
ベテラン
会議室デビュー日: 2003/03/24
投稿数: 59
お住まい・勤務地: Osaka
投稿日時: 2004-10-28 09:15
ちょっとたてこんでるので一言だけ、
引用:

おかもとさんの書き込み (2004-10-27 10:25) より:

EJBの場合は、JNDIで管理するリソースが多いので、毎回lookupしていると
コストが馬鹿にならないと言うのは理解が出来ますが、


・・・ということはJNDI lookupがコストのかかる処理であるということは
認識されているわけですよね?
要はその回数が多いか少ないかが問題だということで良いですか?
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2004-10-28 09:38
引用:

kitoさんの書き込み (2004-10-28 09:15) より:
・・・ということはJNDI lookupがコストのかかる処理であるということは
認識されているわけですよね?
要はその回数が多いか少ないかが問題だということで良いですか?




大体そんな認識ですが、誤解の無いように言いますと、JNDIのlookupに限らず
何らかの処理を行うと一定のコストが掛かるのは当然です。
だからといって何でもかんでもキャッシュするわけではないですよね?
個人的な見解としては一回のHTTPRequest中にDataSourceを一回lookupする
だけなら大勢に影響ないのでは?と言うことです。

お互いの認識は大体見えてきたと思いますし、具体的な実例として、
DataSourceのlookupは「全然遅くない」「いや、こんなにコストが掛かるんだよ」
と言うデータが出てこない以上、このあたりで議論は終結した方が良いと思います。

すみません。変な議論に巻き込んで。
T2
常連さん
会議室デビュー日: 2002/02/20
投稿数: 37
投稿日時: 2004-10-28 11:50
こんなコードを書いてServletから呼んでみました。
DataSourceの取得を100回行うのに何ミリ秒かかったかを10回測定します。
getDataSource() はキャッシュありで、getDataSource2()はキャッシュなしです。

環境
OS:Windows2000pro
CPU:Pentium4 1.4GHz
RAM:DDR1GB
コンテナ:Tomcat5.0.28
RDB:PostgreSQL7.4(Cygwin上で動作)
コンテナとRDBMSは同一ホスト(localhost)上で動作

// DataSource を保持する変数
private static DataSource ds = null;
// lookup で使用するJNDI名
private static final String JNDI_NAME = "java:comp/env/jdbc/hogehoge";

private static DataSource getDataSource() throws Exception {
if (ds == null) {
InitialContext ic = new InitialContext();
ds = (DataSource) ic.lookup(JNDI_NAME);
}
return ds;
}
private static DataSource getDataSource2() throws Exception {
InitialContext ic = new InitialContext();
ds = (DataSource) ic.lookup(JNDI_NAME);
return ds;
}
public static void connTest() throws Exception {
long startTime;
long finishedTime;
System.out.println("キャッシュあり");
for (int i = 0; i < 10; i++) {
startTime = System.currentTimeMillis();
for (int j = 0; j < 100; j++) {
getDataSource();
}
finishedTime = System.currentTimeMillis();
System.out.println((finishedTime - startTime));
}
System.out.println("キャッシュなし");
for (int i = 0; i < 10; i++) {
startTime = System.currentTimeMillis();
for (int j = 0; j < 100; j++) {
getDataSource2();
}
finishedTime = System.currentTimeMillis();
System.out.println((finishedTime - startTime));
}
}

結果は以下の通り。
キャッシュなしでも、平均で100回のlookupに27ミリ秒ですから、
これを遅いと思うか気にしないかですね・・・

キャッシュあり
20
0
0
0
0
0
0
0
0
0
キャッシュなし
50
30
20
20
70
10
10
10
20
30
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2004-10-28 12:01
引用:

T2さんの書き込み (2004-10-28 11:50) より:
キャッシュなしでも、平均で100回のlookupに27ミリ秒ですから、
これを遅いと思うか気にしないかですね・・・




検証ありがとうございます。私のところで手動で実行したのと大体同じ結果ですね。

取り急ぎお礼まで。
kito
ベテラン
会議室デビュー日: 2003/03/24
投稿数: 59
お住まい・勤務地: Osaka
投稿日時: 2004-10-29 01:14
あらら・・・
「パフォーマンスに大差が無いからDataSourceに限ってはキャッシュする必要は無い」
という結論に持っていきますか。
なにか釈然としませんが。
その論理だとEJBを使っても同じ結果になりませんか?最近のコンテナなら特に。
(環境によっても大きく変わるでしょうけど)

業務でパフォーマンスチューニングを目指す場面ならそれでも良いかもしれません。
(↑ボトルネックになっていないところは無視する)
しかし、おかもとさんの書かれていた「初心者への啓蒙」ということであれば、
「明らかに無駄な処理を行っているところは改善しましょう」
というスタンスの方が良いのではないかと思います。
「無駄な処理であっても、全体のパフォーマンスに影響が少なければ放っておく」
というのはその後で考えることでしょう。

個人的には
String s = new String();
などと同じ部類のコーディングに思えます。(かなり極端な例ですが)

個人的には多少のパフォーマンスの差よりも綺麗なコードを書くことを重視するので、
はやりキャッシュすることを薦めます。
それにConnectionを取得しようとする度に毎回InitialContextから作り直すのは
非常に煩雑な作業だと思うのですが、そうではないですかね。

ま、同意してはもらえなさそうな雰囲気なので、議論は終わりで良いです。(^^;
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2004-10-29 11:22
一つだけ言っておきます。

引用:

kitoさんの書き込み (2004-10-29 01:14) より:
個人的には多少のパフォーマンスの差よりも綺麗なコードを書くことを重視するので、
はやりキャッシュすることを薦めます。
それにConnectionを取得しようとする度に毎回InitialContextから作り直すのは
非常に煩雑な作業だと思うのですが、そうではないですかね。



上記のような作業はフレームワークで吸収する部分なので、
Connectionを取得するたびにInitialContextから作り直す部分を、
末端の開発者に記述して貰うような不細工なことは絶対にしません!

で、キャッシュするか否かは、その一カ所で判断して切り替えれば
良いと思います。

ではでは。
未記人
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 70
投稿日時: 2004-10-29 12:48
引用:

おかもとさんの書き込み (2004-10-29 11:22) より:
一つだけ言っておきます。

引用:

kitoさんの書き込み (2004-10-29 01:14) より:
個人的には多少のパフォーマンスの差よりも綺麗なコードを書くことを重視するので、
はやりキャッシュすることを薦めます。
それにConnectionを取得しようとする度に毎回InitialContextから作り直すのは
非常に煩雑な作業だと思うのですが、そうではないですかね。



上記のような作業はフレームワークで吸収する部分なので、
Connectionを取得するたびにInitialContextから作り直す部分を、
末端の開発者に記述して貰うような不細工なことは絶対にしません!

で、キャッシュするか否かは、その一カ所で判断して切り替えれば
良いと思います。

ではでは。


それと「JNDIのlookupが重いかどうかあなたがどう考えているか?」と何の関係が?
質問に答えずに論点をずらすだけでは対話になりませんよ〜

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