2017-05-20 8 views
0

異なるエンティティオブジェクトに関する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つのトランザクションだけに制限します。

ありがとうございます。

答えて

1

セッションごとの操作は、パフォーマンス上の理由からではなく、anti-patternです。データベースをトランザクションが完了するのを待つのは余分な計算(データベースI/O操作は完了するまでに数ミリ秒かかり、計算には時間がかかります)に比べて長い時間がかかります。完成までナノ秒)。

あなたはWebアプリケーションを作成しようとするので、一種のあなたがGenericServiceのコンストラクタで、今何しているHibernateのsessionFactory.getCurrentSession()を使用してみてください - user guidethis answerjavadocsで詳細。

+0

メモリに保存されているアクティブなセッションオブジェクト(またはエンティティマネージャオブジェクト)の量を減らしてパフォーマンスを向上させることはできませんか? – Maurice

+1

パフォーマンスの向上に気づくことはありません。 2つのシナリオ(セッションを再利用することと、毎回新しいものを作成すること)のために、プロダクションのようなセットアップ(例えば、メモリ内データベースではなく実際のデータベースを使用する)でパフォーマンスの増加を測定してみてください。私はあなたがパフォーマンスの増加がほとんど測定可能でないことが分かると思います。ここで私の主なポイントは、適切な品質のコードを最初に(正しいことをやって)焦点を当て、必要が生じるまで(たとえば、Webリクエストの応答が遅すぎる場合)パフォーマンスをあまり心配しないことです。 – vanOekel

関連する問題