1

私たちは製品を構築しているので、パフォーマンスの観点から助けが必要です。完全な Spring (MVC、JPA、セキュリティなど) を使用しています。

たとえば、特定のフローで 100 個のビジネス ルールを同時に実行できるという要件があります。nこのようなフローとビジネス ルールは多数存在する可能性があります。

これらのルールを実行すると、実際にデータベース内のテーブルからレコードがフェッチされます。これらには、LAZILY INITIALIZED ENTITIES もほとんど含まれません。

マルチスレッドの目的でFutures/を使用しましたが、問題は LAZY 変数のロードに失敗することです。CallablesHibernate の読み込み例外が発生します。おそらく、TRANSACTIONAL で別のスレッドに分散されないという問題があります。

他にアプローチする方法があれば教えてください。

4

2 に答える 2

1

一部のエンティティ/エンティティコレクションが遅延フェッチされ、別のスレッドでアクセスしている場合、LazyInitialization遅延ロードされたエンティティはトランザクション内でのみアクセスでき、トランザクションはスレッドにまたがらないため、例外が発生します。

DTOパターンを使用するか、スレッド間でエンティティを共有している場合は、トランザクション内で遅延初期化されたコレクションゲッターを呼び出して、トランザクション自体内でフェッチされるようにします。

于 2012-11-09T16:39:53.600 に答える
0

本当に非同期処理が必要な場合は、Java EE で指定された方法、つまりJMS / MDBを使用することをお勧めします。

とにかく、処理のためにとにかくすべてのデータをロードしたいようです。そのため、必要なすべてのデータをEagerフェッチし、並列処理のためにデータを送信します。または、それぞれのTasks( Callables) に必要なデータを取得させます。基本的に、トランザクションの境界が複数のスレッドにまたがらないように設計を変更してください。単一のスレッド内で境界をローカライズします。

于 2012-11-09T16:51:36.413 に答える