- - PR -
javax.sql.DataSourceを実装したクラスはスレッドセーフか?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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の使用目的からしてほぼ全ての実装はスレッドセーフであると考えられますが 実装依存を前提にプログラムを書くのもどうかと思ってお聞きする次第です。 | ||||
|
投稿日時: 2004-06-16 06:19
DataSourceがスレッドセーフかどうかはベンダ依存です。
商用RBMSの場合はまず間違いなくスレッドセーフだと思いますが念のため問い合わせてみてはいかがでしょうか。 もしスレッドセーフでなくともスレッドセーフなDataSourceのラップクラスを書くとかしてやればとりあえずは動くでしょう。遅いと思いますが。 | ||||
|
投稿日時: 2004-06-16 13:35
Anthyhimeさん、ご回答ありがとうございます。
自分の使用している実装についてはスレッドセーフであることを確認しております。 ただこのことはポータブルなコードを書くために私をはじめ多くの人が知っておくべきだと思いました。 スレッドの参照だけは増えているので皆さん関心はあるのでしょうね。 | ||||
|
投稿日時: 2004-06-17 10:22
調べてみました。
JDBC の「For Driver Writers」 (http://java.sun.com/products/jdbc/driverdevs.html) の A.1.6 に、
と書いてありますので、スレッドセーフのはずです。 | ||||
|
投稿日時: 2004-06-17 11:26
顔爺さん、ありがとうございました。
これは当に私が欲していた言質です。 (やはり探し方が悪かった...) |
1