gpt4 book ai didi

java - 使用 Hibernate 5.2 将查询结果作为流

转载 作者:太空狗 更新时间:2023-10-29 22:55:56 25 4
gpt4 key购买 nike

从 Hibernate 5.2 开始,如果我们想要获取大量数据,我们可以使用 stream() 方法代替 scroll()

但是,当将 scroll()ScrollableResults 一起使用时,我们能够 Hook 到检索过程中,并通过从持久上下文中逐出对象来释放内存在处理它和/或不时清除整个 session 之后。

我的问题:

  1. 现在,如果我们使用 stream() 方法,幕后会发生什么?
  2. 是否可以从持久上下文中逐出对象?
  3. session 是否定期清除?
  4. 如何实现最佳内存消耗?
  5. 是否可以使用例如无状态 session ?
  6. 此外,如果我们在 JPA 属性中将 hibernate.jdbc.fetch_size 设置为某个数字(例如 1000),那么这与可滚动结果的结合如何?

最佳答案

以下对我有用:

DataSourceConfig.java

@Bean
public LocalSessionFactoryBean sessionFactory() {
// Link your data source to your session factory
...
}

@Bean("hibernateTxManager")
public HibernateTransactionManager hibernateTxManager(@Qualifier("sessionFactory") SessionFactory sessionFactory) {
// Link your session factory to your transaction manager
...
}

MyServiceImpl.java

@Service
@Transactional(propagation = Propagation.REQUIRES_NEW, transactionManager = "hibernateTxManager", readOnly = true)
public class MyServiceImpl implements MyService {

@Autowired
private MyRepo myRepo;
...
Stream<MyEntity> stream = myRepo.getStream();
// Do your streaming and CLOSE the steam afterwards
...

MyRepoImpl.java

@Repository
@Transactional(propagation = Propagation.MANDATORY, transactionManager = "hibernateTxManager", readOnly = true)
public class MyRepoImpl implements MyRepo {

@Autowired
private SessionFactory sessionFactory;

@Autowired
private MyDataSource myDataSource;

public Stream<MyEntity> getStream() {

return sessionFactory.openStatelessSession(DataSourceUtils.getConnection(myDataSource))
.createNativeQuery("my_query", MyEntity.class)
.setReadOnly(true)
.setFetchSize(1000)
.stream();
}
...

请记住,当您流式传输时,您实际上只需要在对象具体化时注意内存。这确实是操作中唯一容易出现内存问题的部分。在我的例子中,我一次将流分 block 为 1000 个对象,使用 gson 将它们序列化并立即将它们发送到 JMS 代理。垃圾收集器完成剩下的工作。

值得注意的是,Spring 的事务边界感知在不需要显式告知的情况下,会在最后关闭与 dB 的连接。

关于java - 使用 Hibernate 5.2 将查询结果作为流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43936138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com