Webアプリケーションで使用するときに問題を引き起こすJava DAOのメソッドで 'synchronized'キーワードを使用していますか?Java DAOで同期を使用していると問題が発生しますか?
ここに示すように、リソースの競合を避けるためにメソッドを同期させる必要があるマルチスレッドのスタンドアロンアプリケーションがあるので、私は尋ねます。私は心配です何
java.util.concurrent.ExecutionException: javax.persistence.PersistenceException: org.hibernate.HibernateException: Found shared references to a collection: com.replaced.orm.jpa.Entity.stuffCollection
があること人々のかなりの数がしようとすると、同期方法はブロックし、アプリケーション全体を遅くするアプリケーションを使用する場合。
私は、スプリングで注入されたJPAエンティティマネージャファクトリを使用しています。これは、DAOにエンティティマネージャを提供します。私は技術的にDAOレイヤーを削除し、クラスでエンティティマネージャーファクトリを直接呼び出すことができますが、DAOが提供する分離を楽しむことができます。
スレッド間で接続されたエンティティORMオブジェクトを渡さないように非常に注意しています。私は、DAOにアクセスする際にリソースの競合エラーが発生すると推測しています。私は、複数のスレッドが同時に進行していて、非原子的な方法でデータベースを永続化または読み込みしようとしていると思います。
この場合、DAOを使用して、より多くの害を及ぼしていますか?
私が質問から外した大きな情報は、DAOはシングルトンではないということです。もし私がその詳細を含めるだけでも十分に分かりやすいと思っていたなら、おそらく最初にその質問をしなかったでしょう。
私が正しく理解していれば、Springはそれを使用するクラスごとにDAOクラスの新しいインスタンスを作成します。したがって、バッキングエンティティマネージャは各スレッドに対して一意でなければなりません。エンティティマネージャを共有していないのは、Rob Hが答えたように、ここで重要なことです。
しかし、同期を解除するとエラーが発生する理由はわかりません。
このthreadによると、@PersistenceContextアノテーションはスレッドセーフSharedEntityManagerを作成します。したがって、シングルトンDAOを作成できるはずです。
あなたは、同期を使用する理由と、どのような種類の「リソースの競合」を参照しているのでしょうか? – skaffman