java – 使用Hibernate和Spring进行批量插入
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用Hibernate和Spring进行批量插入,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2437字,纯文字阅读大概需要4分钟。
内容图文
![java – 使用Hibernate和Spring进行批量插入](/upload/InfoBanner/zyjiaocheng/826/e7da479d79ca490492b57c45532a162f.jpg)
我的应用程序基于Hibernate 3.2和Spring 2.5.以下是应用程序上下文中与事务管理相关的代码段:
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="nestedTransactionAllowed" value="true"/>
</bean>
<bean id="transactionTemplate" classs="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="txManager"/>
</bean>
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation" value="classpath:/hibernate.cfg.xml"></property>
</bean>
对于所有DAO,都有相关的Service类,并且使用@Transactional对服务层中的每个方法处理事务.但是现在有一个场景,DAO中的方法说服务层调用“parse()”.在服务层我指定了@Transactional(readOnly = false). DAO中的这个解析方法在同一个DAO中调用另一个方法说“save()”,它在数据库中存储了大量的行(大约5000个).现在,在解析函数的循环中调用save方法.现在的问题是,在大约100次调用“保存”方法之后..我有时会得到OutOfMemory异常或有时程序停止响应.
现在这些是我对save方法所做的更改:
Session session = getHibernateTemplate().getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
int counter = 0;
if(books!=null && !books.isEmpty()){
for (Iterator iterator = books.iterator(); iterator
.hasNext();) {
Book book = (Book) iterator.next();
session.save(book);
counter++;
if(counter % 20==0) {
session.flush();
session.clear();
}
}
}
tx.commit();
session.close();
这是我的应用程序中唯一的方法,我开始这样的事务并在方法结束时提交它.否则我通常只调用getHibernateTemplate.save().我不确定是否应该在DAO中单独执行此保存方法的事务管理,方法是在save()上放置@Transactional(readOnly = false,PROPOGATION = NEW),或者这种方法是否正常?
我还在hibernate.cfg配置文件中将hibernate.jdbc.batch_size更新为20.
有什么建议?
解决方法:
对于使用hibernate进行批量插入,最好的做法是StatelessSession,它不会缓存你实体的任何状态,你不会遇到OutOfMemory,代码如下:
if (books == null || books.isEmpty) {
return;
}
StatelessSession session = getHibernateTemplate().getSessionFactory().openStatelessSession();
Transaction tx = session.beginTransaction();
for (Book each : books) {
session.insert(book);
}
tx.commit();
session.close();
StatelessSession的Transaction与当前的事务上下文无关.
内容总结
以上是互联网集市为您收集整理的java – 使用Hibernate和Spring进行批量插入全部内容,希望文章能够帮你解决java – 使用Hibernate和Spring进行批量插入所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。