0

ハイバネートを使用してデータをテーブルに挿入するアプリケーションがあります。データベースは SQL サーバーです。アプリケーション自体は Tomcat 6 にデプロイされています。データを DB テーブルに挿入するには、Tomcat 接続プールの最小構成 (MaxActive=150、maxIdle =10 など) で BasicDataSource を使用しています。

今の問題は、アプリケーションに並行性を追加したいということです。その過程で、DB 挿入を実行する dao レベルのメソッドを呼び出すビジネス層メソッドへの同時呼び出しを行っています。これにより、以下のエラーが発生します。

Exception occurred java.util.concurrent.ExecutionException: org.hibernate.HibernateException: 
Illegal attempt to associate a collection with two open sessions  

データベースを監視すると、複数のスレッドが作成されていますが、閉じられていません。

これをデバッグ/修正するためにさらに進む方法がわかりません。どんなポインタも役に立ちます。

4

1 に答える 1

0

Hibernateがあなたに言っている場合:

Illegal attempt to associate a collection with two open sessions

基本的に、2 つのセッションを開き、それぞれにトランザクションがあり、あるトランザクションのセッションを別のトランザクションに保存しようとしています。同時実行性は、ここでの大きな問題です。セッションを慎重に処理するようにアプリケーションを設計すれば、これに取り組むことができます。Stack-Trace は、どの関数が例外を引き起こしているかを示します。作業単位がセッションでどれくらい続くかを確認し、それらを減らしてみて、使用後にセッションが常に閉じられていることを確認してください。

休止状態で実装されたアプリケーションは、さまざまなパターンを持つことができます。

リクエストごとのセッションのパターンが必要です 。このモデルでは、クライアントからのリクエストがサーバーに送信され、そこで Hibernate 永続レイヤーが実行されます。新しい Hibernate セッションが開かれ、すべてのデータベース操作がこの作業単位で実行されます。作業が完了し、クライアントへの応答が準備されると、セッションはフラッシュされて閉じられます。単一のデータベース トランザクションを使用してクライアント リクエストを処理し、セッションを開いたり閉じたりするときにそれを開始およびコミットします。2 つの関係は 1 対 1 であり、このモデルは多くのアプリケーションに最適です。

Do not use the anti-patterns session-per-user-session or session-per-application

Hibernate DocumentationTransaction And Concurrencyは、詳細な分析と例を提供します

于 2013-10-09T09:38:32.483 に答える