在hibernate中插入大量记录的最佳方法
我正在使用hibernate + play! 工作中的框架,是否有使用hibernate插入大量记录的“最佳实践”? 它们每个文本文件大约有6,000到10,000个,因此我不知道Hibernate是否会在工作中窒息或抛出exception。
任何建议让我知道,如果我需要解释更多,请告诉我
从* Java Persistence和Hibernate(Manning)并遵循Pangea的评论,使用无状态会话(没有持久性上下文缓存):
StatelessSession session = sessionFactory.openStatelessSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<100000; i++ ) { Item item = new Item(...); session.insert(item); } tx.commit(); session.close();
只是对Kartoch答案中的代码进行了一些修改。
根据Batch Procession ,“StatelessSession接口定义的insert(),update()和delete()操作被认为是直接数据库行级操作。它们分别导致立即执行SQL INSERT,UPDATE或DELETE它们与Session接口定义的save(),saveOrUpdate()和delete()操作具有不同的语义。
StatelessSession不再有save(),flush(),clear()。 代码应该是这样的:
StatelessSession session = sessionFactory.openStatelessSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<100000; i++ ) { Item item = new Item(.....); session.insert(item ); } tx.commit(); session.close();
最后,下面讨论正常批量插入和StatelessSession插入之间的区别: 使用StatelessSession进行批处理 。
只需打开您的会话和交易。
添加会话保存中的所有元素。
然后提交事务。
//Remember to effective handler errors public void saveAll(List
最好是使用StatelessSessions。 请考虑以下示例( http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/batch.html ):
StatelessSession session = sessionFactory.openStatelessSession(); Transaction tx = session.beginTransaction(); ScrollableResults customers = session.getNamedQuery("GetCustomers") .scroll(ScrollMode.FORWARD_ONLY); while ( customers.next() ) { Customer customer = (Customer) customers.get(0); customer.updateStuff(...); session.update(customer); } tx.commit(); session.close();
如果要在hibernate之外进行插入,可以直接获取Connection对象。
Connection connection = DB.getConnection();
- 如何在spring / hibernate / jpa中创建自动表创建?
- Spring 3 MVC Hibernate 3.5.4 hibernateTemplate没有关闭连接(非事务性)
- hibernate选择所有投影组
- Hibernate ManyToMany是否可以为非键列自连接? 获取mappingException
- 如何避免创建多余的实体?
- 使用SequenceGenerator的javax.persistence.EntityExistsException
- Java Hibernate与SQL Server 2012无法正常工作?
- Java – Hibernateexception – 无法映射反馈
- java.lang.ClassCastException:java.lang.Long无法在java 1.6中强制转换为java.lang.Integer