JBoss 7 にデプロイされた Java EE アプリケーションで PostgreSQL 9.1 JDBC4 ドライバー (postgresql-9.1-902.jdbc4.jar) を使用しています。
複数のスレッドが getConnection() メソッドを同時に呼び出すことができるように、 javax.sql.DataSourceはスレッドセーフであると想定できますか?
JBoss 7 にデプロイされた Java EE アプリケーションで PostgreSQL 9.1 JDBC4 ドライバー (postgresql-9.1-902.jdbc4.jar) を使用しています。
複数のスレッドが getConnection() メソッドを同時に呼び出すことができるように、 javax.sql.DataSourceはスレッドセーフであると想定できますか?
通常、DataSource
Java EE コンテナーから取得する実装は、接続プールによってサポートされるスレッド セーフなオブジェクトであり、基になる JDBC 接続のスレッド セーフ (またはその他) は実際には関係ありません。データベースと対話する必要がある場合の通常のパターンはgetConnection()
、データ ソースを呼び出して接続オブジェクトを取得し、必要なデータベース呼び出しをclose()
行ってから接続することです。内部的には、これは実際には基になる接続を閉じませんが、将来の使用のために接続プールに戻すだけです。個々の接続は、一度に 1 つのスレッドによってのみ使用されます。
これは、Spring などで使用されるイディオムJdbcTemplate
です。
「接続プーリングの実装」の場合は、スレッド セーフにする必要があります。