- PR -

javax.sql.DataSourceを実装したクラスはスレッドセーフか?

1
投稿者投稿内容
meltingpot
常連さん
会議室デビュー日: 2004/06/15
投稿数: 24
投稿日時: 2004-06-15 17:39
ServletプログラミングのサンプルなどでのDataSourceの扱いを見ると、
(1) Servletに対するリクエストの度にDataSourceを取得して使い捨てる。
(2) Servlet#init()でDataSourceを取得してインスタンス変数としてキャッシュする。
の二通りを見かけます。

(1)は確実なやり方ですが、namingサービスからDataSourceを取得する処理は決して軽くないので、せっかくConnection Poolingを行っても台無しになりかねないと思います。
(2)の方法はスマートで効率もよさそうですが、明らかにDataSourceがスレッドセーフで
あることを前提としています。

しかしJDBCドキュメント等を探したのですが、この件に関するDataSourceの実装規定は
見つけることができませんでした。
Connection Poolingの使用目的からしてほぼ全ての実装はスレッドセーフであると考えられますが
実装依存を前提にプログラムを書くのもどうかと思ってお聞きする次第です。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2004-06-16 06:19
DataSourceがスレッドセーフかどうかはベンダ依存です。
商用RBMSの場合はまず間違いなくスレッドセーフだと思いますが念のため問い合わせてみてはいかがでしょうか。
もしスレッドセーフでなくともスレッドセーフなDataSourceのラップクラスを書くとかしてやればとりあえずは動くでしょう。遅いと思いますが。
meltingpot
常連さん
会議室デビュー日: 2004/06/15
投稿数: 24
投稿日時: 2004-06-16 13:35
Anthyhimeさん、ご回答ありがとうございます。
自分の使用している実装についてはスレッドセーフであることを確認しております。
ただこのことはポータブルなコードを書くために私をはじめ多くの人が知っておくべきだと思いました。
スレッドの参照だけは増えているので皆さん関心はあるのでしょうね。
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-06-17 10:22
調べてみました。

JDBC の「For Driver Writers」
(http://java.sun.com/products/jdbc/driverdevs.html)
の A.1.6 に、

引用:

All operations on java.sql and javax.sql objects are required to be multithread safe.



と書いてありますので、スレッドセーフのはずです。

meltingpot
常連さん
会議室デビュー日: 2004/06/15
投稿数: 24
投稿日時: 2004-06-17 11:26
顔爺さん、ありがとうございました。
これは当に私が欲していた言質です。
(やはり探し方が悪かった...)
1

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