私は、Hibernateと春+春データJPAを使用していると私はいくつかの大規模で高価なデータベース操作を実行する必要があります。SpringデータJPAとHibernateでStatelessSessionを使用するには?
は、私はこれらの操作の種類を実行するためにStatelessSession
を使用することができますどのように?
私は、Hibernateと春+春データJPAを使用していると私はいくつかの大規模で高価なデータベース操作を実行する必要があります。SpringデータJPAとHibernateでStatelessSessionを使用するには?
は、私はこれらの操作の種類を実行するためにStatelessSession
を使用することができますどのように?
ソリューションは、このStatelessSession
を作成して、カスタムリポジトリの実装でそれを注入する春のファクトリーBeanを実装することです:
public class MyRepositoryImpl implements MyRepositoryCustom {
@Autowired
private StatelessSession statelessSession;
@Override
@Transactional
public void myBatchStatements() {
Criteria c = statelessSession.createCriteria(User.class);
ScrollableResults itemCursor = c.scroll();
while (itemCursor.next()) {
myUpdate((User) itemCursor.get(0));
}
itemCursor.close();
return true;
}
}
はStatelessSessionFactoryBean
とフル要旨hereをチェックしてください。 Spring 3.2.2、Spring Data JPA 1.2.0およびHibernate 4.1.9を使用します。
このJIRAのおかげとStatelessSessionFactoryBean
コードを添付男。これが誰かに役立つことを願って、それは私の魅力のように働いた。
あなたはSessionFactoryの設定(すなわち:LocalEntityManagerFactoryBean
)にhibernate.jdbc.batch_size
プロパティを設定することによりSessionFactory
/EntityManager
上のJDBCバッチ文を有効にすることができた結果、より良いパフォーマンスを得るために。
jdbcの最適な利点を得るには、挿入/更新をできるだけ多くのエンティティで実行します。 Hibernateは、別のエンティティタイプを書き込むときにそれを検出し、設定されたバッチサイズに達していなくても自動的にバッチをフラッシュします。 StatelessSessionを使用して
は、基本的には、SpringのJdbcTemplate
のようなものを使用するのと同じ動作をします。 StatelessSession
を使用する利点は、SQLへのマッピングと変換がHibernateによって処理されることです。あなたが私を使用する場合StatelessSessionFactoryBean
あなたも、1つのトランザクションで混合Session
とStatelessSession
を混在させることができます。しかしSession
によってロードされたエンティティを変更し、それが問題をロックになりますのでStatelessSession
でそれを持続するように注意してください。それはあなたがこれでそれを行うことができますnecesaryいない
:セッションは、データベース接続を保持しているので
public void bulkInsert(Collection<YourClass> yourObjects)
{
if (yourObjects == null || yourObjects.isEmpty()) {
return;
}
yourRepository.save(yourObjects);
}
、あなたのstatelessSessionインスタンスの寿命を懸念していますか? statelessSessionが保持する接続のライフタイムは、MyRepositoryImplインスタンスのライフタイムと本質的に同じではないでしょうか? – mangotang
プロキシのように見え、実際のstatelessSessionはStatelessSessionSynchronizationによって閉じられます – user472749