異なるエンティティオブジェクトに関するCRUDアクションに対して複数のトランザクションをコミットするために1つのエンティティマネージャを使用したいと考えています。例えば、私はcatエンティティオブジェクトを削除し、1つのエンティティマネージャセッション中に新しいdogエンティティオブジェクトを作成したいと考えています。1つのセッション中に複数のトランザクションをコミットすると、パフォーマンスが向上しますか?
public abstract class GenericService<T> {
private Class<T> type;
protected static EntityManager entityManager;
public GenericService() {
Type t = getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
type = (Class) pt.getActualTypeArguments()[0];
if (entityManager == null || !entityManager.isOpen()) entityManager = GetEntityManager.getInstance(); // zo kunnen meerdere services gebruik maken van dezelfde entitymanager sessie. 1 operation per sessie is een antipattern namelijk. Beter meerdere operations in 1 sessie doen.
}
// sluit entityManager en daarmee dus ook de sessie af.
public void close(){
entityManager.close();
}
今、両方のサービスが同じEntityManagerを共有する:私はのGenericServiceを拡張(CRUDオブジェクトができるオブジェクト)がcatServiceとdogServiceを持っていることによって、これを達成します。これで、複数のトランザクションを作成し、継承したclose()メソッドを最後のServiceオブジェクトに対してのみ呼び出すことができます。最後のServiceオブジェクトは共有エンティティマネージャを閉じます。
私は、エンティティマネージャセッションを、異なるエンティティオブジェクトで動作している別のserviceObjectによって共有されることによってより効率的に使用することが、新しいセッションのオープンとクローズに比べてパフォーマンスが向上すると思いますエンティティマネージャ)を1つのトランザクションだけに制限します。
ありがとうございます。
メモリに保存されているアクティブなセッションオブジェクト(またはエンティティマネージャオブジェクト)の量を減らしてパフォーマンスを向上させることはできませんか? – Maurice
パフォーマンスの向上に気づくことはありません。 2つのシナリオ(セッションを再利用することと、毎回新しいものを作成すること)のために、プロダクションのようなセットアップ(例えば、メモリ内データベースではなく実際のデータベースを使用する)でパフォーマンスの増加を測定してみてください。私はあなたがパフォーマンスの増加がほとんど測定可能でないことが分かると思います。ここで私の主なポイントは、適切な品質のコードを最初に(正しいことをやって)焦点を当て、必要が生じるまで(たとえば、Webリクエストの応答が遅すぎる場合)パフォーマンスをあまり心配しないことです。 – vanOekel