gpt4 book ai didi

java - 批处理在 Spring+Hibernate+JPA 中内存不足

转载 作者:行者123 更新时间:2023-11-29 03:53:24 27 4
gpt4 key购买 nike

我有一个批处理过程,可以一条一条地保留 1000000 条记录。每条记录都有自己的子表。我正在使用 Spring 2.5.6、Hibernate 和 JPA 来做到这一点。但是一小时后它就失去了内存。谁能告诉我我的申请中可能有什么问题?

代码如下:

Public void processFeeds(List<Objects> feeds){

for(Feed feed : feeds){
Feed feed=getDAOMainFeedService().persist(feed);

//Saving the child information
if(feed.getID()>0) {
for(Address address : feeds.getAddress()){
getDAOAddressService().persist(feed.getID,address);
}

for(PersonalInfo pi: feeds.getPersonalInfo){
getDAOPIService().persist(feed.getID,pi);
}
}
}

}

//service Class code:
public class MainFeedServiceDAOImpl extends JpaDaoSupport implements IVehYmmRevDAO
public Feed persist(Feed feed)
{


try
{
getJpaTemplate().persist(feed);
feed=getJpaTemplate().merge(feed);
getJpaTemplate().flush();

return feed;
}
catch (Exception exception)
{
logger.error("Persit failed",
exception);
throw new DatabaseServiceException(
"Persit failed", exception);
}
}

}

其他DAO类也有相同的MainFeedServiceDAOImpl实现,使用Spring注入(inject)到上面的Database服务层。请提出一些建议。

最佳答案

您的程序内存不足的原因是因为您插入的每个对象都保留在您的 session 中。您需要偶尔清除它。

我将以这种方式更改持久化方法:

public void persist(List<Feed> feeds)
{
int count = 0;
try
{
for (Feed feed : feeds) {
getJpaTemplate().persist(feed);
if (count % 10000 == 0) {
getJpaTemplate().flush();
getJpaTemplate().getEntityManager().clear();
}
count++;
}
}
catch (Exception exception)
{
logger.error("Persist failed", exception);
throw new DatabaseServiceException("Persist failed", exception);
}
}

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-inserts

您可以对您的地址和个人信息对象遵循相同的模式,但如果您设置了正确的映射和级联,您可能根本不需要这样做。

关于java - 批处理在 Spring+Hibernate+JPA 中内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7688986/

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