我正在使用Spring + Spring數據JPA與Hibernate,我需要執行一些大型且昂貴的數據庫操作。如何通過Spring Data JPA和Hibernate使用StatelessSession?
我如何使用StatelessSession
來執行這些操作?
我正在使用Spring + Spring數據JPA與Hibernate,我需要執行一些大型且昂貴的數據庫操作。如何通過Spring Data JPA和Hibernate使用StatelessSession?
我如何使用StatelessSession
來執行這些操作?
一個解決方案是實現一個Spring工廠bean創建這個StatelessSession
和自定義庫實現把它注射:
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
時,您甚至可以混合在一次交易中混合使用Session
和StatelessSession
。但要小心修改由Session
加載的實體並將其與StatelessSession
一起保存,因爲這會導致鎖定問題。
這不是necesary你可以用這個做到這一點:
public void bulkInsert(Collection<YourClass> yourObjects)
{
if (yourObjects == null || yourObjects.isEmpty()) {
return;
}
yourRepository.save(yourObjects);
}
由於會話持有數據庫連接,你關心你的statelessSession實例的生命週期? StatelessSession所持有的連接的生命週期是否與MyRepositoryImpl實例的生命週期基本相同? – mangotang
它看起來像是一個代理,真實的無狀態會話由StatelessSessionSynchronization關閉 – user472749