私はマルチスレッドコードの作業バージョンを持っていましたが、私はPreparedStatement-wrapperクラスがスレッドセーフでないことに満足できませんでした。だから、私は、PreparedStatementsをThreadLocal
に生成して、ラッパーをスレッドセーフにすることに決めました。マルチスレッド環境でPreparedStatementsを生成するには?
すぐにSQLExceptionsスタートアップが私を呼び起こします。基本的なOracleエラーはORA-00060 deadlock detected
です。インターネットによれば、書き込みシナリオでのみ発生します。私のステートメントはすべて読み取り専用です。それは、私が意識して聞いたりアクセスしたりしていない、あいまいなACLパッケージで発生します。
Connection
オブジェクトを生成し、DataSource
オブジェクトからのそのオブジェクトからのステートメントを準備することは、データベースのアクセス制御が同時に行われてはならないという仮説を準備し、テストしました「threadsafe」ではないかもしれません(althoug DataSourceが最も確実です)。誰かがその発見を確認したり否定することはできますか?
これが本当に当てはまる場合、マルチスレッドアプリケーションでPreparedStatementが同時に生成されないようにするにはベストプラクティスがありますか?
EDIT:としては、例外のテキストを尋ねた:
Caused by: java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-00060: deadlock detected while waiting for resource
ORA-06512: at "XXX.PKG_ACL", line 129
ORA-06512: at "XXX.PKG_ACL", line 459
ORA-06512: at "XXX.PKG_UTILS", line 1933
ORA-06512: at line 6
私はDBにアクセスするための非常に個人的なPreparedStatementを持つn db-accessorsの固定セットを使用したシナリオを持っています。私は理論的には、データソースがプールを処理する必要があることを理解しています。問題は、n PreparedStatementsを同時に生成すると、データベースにデッドロックが発生することになります。ステートメントをスレッドセーフにするつもりはありません。 – Jonathan