2016-07-05 5 views
0

Springサービスクラスで@Transactionalアノテーションを使用してアプリケーションを開発していました。 db層にアクセスするには、必要なときに現在のセッションを返すAbstractDaoクラスがあります。すなわちSpring MVCとHibernateを使用した非トランザクションDB呼び出しのベストプラクティス

@Autowired 
@Qualifier("sessionFactory") 
private SessionFactory sessionFactory; 

protected Session getSession() { 
    session = sessionFactory.getCurrentSession(); 
} 

protected Criteria createEntityCriteria() { 
    return getSession().createCriteria(persistentClass); 
} 

public List<T> findByCriteria(Criterion criterion) { 
    Criteria criteria = createEntityCriteria(); 
    criteria.add(criterion); 
    return criteria.list(); 
} 

私は本当にそれを必要としないように私には、国境を越えたサポートを削除することを考えていると私は私が毎秒デシベルのインサートの多くの数をサポートする必要があるとして、DB呼び出しのパフォーマンスを向上させたいです。

1)HibernateとSpringで非transnational db操作を使用することはできますか?

2)非トランザクションをサポートするために上記のコードをどのように変更できますか? 上記のコードを次のように作成できますか?

private Session session; 
protected Session getSession() { 
    if (session == null) { 
     session = sessionFactory.openSession(); 
    } 
    return session; 
} 

したがって、createEntityCriteria()はget session()を呼び出すことができます。したがって、上記のコードでユーザーの要求(HTTPスプリングMVC要求)ごとに1つのセッションを管理できます。

ユーザーのリクエストの最後にセッションを終了する必要がありますか?したがって、毎秒300 MVCのユーザリクエストがあると、DBへの300のJDBCコールが開かれます(sessionFactory.openSession()は新しいJDBCコールを作成します)。

+0

トランザクションを使用する必要はありませんが、ここでは注意が必要です。トランザクションは便利です。多少の読書が整っているかもしれません。 https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch13.html – Taylor

答えて

0

トランザクションを作成するのは高価な操作ではないため、読み取り専用操作を実行するメソッド呼び出しをラップしても、ほとんどの一般的なアプリケーションの使用ではパフォーマンスが向上しません。

しかし、アプリケーションが特定の理由でデータを変更する予定があるときは、トランザクション内でラップする必要があります。特に、エンティティの関係の変更など、複数のテーブルを変更する場合は、ステートメントは一緒にバッチ処理され、変更前のコミット時とコミット時の他のセッションでのみ表示されます。これは、データベースの整合性を維持する上で重要です。あなたは、トランザクションを作成しているかどうかを超えて

挿入のパフォーマンスは、多くの場合、あなたは適切なJDBCの設定および/またはかどうかを自然キー対IDENTITYAUTO_INCREMENT、またはSEQUENCE主キーを使用することを選択したかどうかなど、他の要因にもっと大きく依存していますバッチサイズ。

さらに、Webベースのアプリケーションでは、トランザクションを使用しているかどうかを心配するよりも、Webフレームワーク処理コードでパフォーマンスの頭痛が増えている可能性があります。

JDBCコールに関しては、ここでも接続プールが便利です。

アプリケーションに指定された最大接続数しか渡されず、その上限に達すると、接続要求は、接続が利用可能になるまで数秒待つか、すぐに例外をスローするか、アプリケーションが必要に応じてそれを処理できるようにします。

関連する問題