javax.sql.DataSourceはスレッドセーフか
というのが気になりました。
Webアプリケーションの開発で、
JNDIでInitialContextからDataSourceを取得してキャッシュするようなコードをよく見ます。
例えばこんなの。
private static DataSource ds = null; public static Connection getConnection() throws NamingException, SQLException{ if(ds == null){ InitialContext ic = new InitialContext(); ds = (DataSource)ic.lookup("java:/comp/env/jdbc/xxx"); } return ds.getConnection(); }
上記のメソッドはちょっとイマイチなとこもあるけど、まー気にしない。
static変数にDataSourceオブジェクトを保持するってことは、
複数のスレッドから共有されるので、
DataSourceオブジェクトはマルチスレッド環境での動作が保証されてないと困ります。
なんですが、
DataSourceがスレッドセーフな実装となっている、かどうかは実装元(多くの場合はベンダー)に依存するわけで、
WebLogicなどの場合、実装コードは隠蔽されてしまっていて確認することはできません。
とりあえずJavadoc見よ、と思い、
DataSourceのJavadocにスレッドセーフうんぬんの記述があるのかな、と思いきや、
Javadocにはその辺については書いてない模様。
なんかしっくりこないので嫌だなーと思い、
自称Javaコンサルタントのid:kiy0takaに聞いてみたところ、
以下のような情報を教えてくれました。ありがとう。
javax.sql.DataSourceを実装したクラスはスレッドセーフか? − Java Solution − @IT
やっぱり同じような疑問を持つ人はいるんですね。
そしてそれを@ITで質問してくれた方に感謝。
回答してくれた方にも感謝。
@ITにも感謝。
大事な部分を抜粋すると
All operations on java.sql and javax.sql objects are required to be multithread safe.
java.sql、javax.sqlパッケージのオブジェクトに関する全ての操作はスレッドセーフである必要がある。
と。
Java SE Technologies - Database
あとで全部読む。予定。