Hibernate 批量插入的测试:
最近在项目中做了一个充值卡的模块,用到了批量插入:我一开始用hibernate插入五十万条数据:选说一下我的记算机配置:
内存:1G,CPU:Pentium(R) 4 CPU 3.20GHz. 配置应该算是过时的了,
我的数据库是:oracle10G,数据库服务器在外地,我测试插入到十万条的时候用了二十五分钟,后来我把程序放到外网服务器:配置:酷睿2代 2.0,4G内存,
插入十万条是五分钟,速试是大大的提升,但是我还是感觉有点慢,后来我用JDBC的批处理:还是在我本地插入:10万条用时:不到1分钟,如果放到外网服务器就更快。
下面贴一下我的代码:hibernate批量导入代码:(只是部分代码,不能运行。)
public boolean addCardList( final SysCardImport sysCardImport,final Date date){
boolean bool =(Boolean) hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
boolean flag=true;
try {
int i=0;
String temp=sysCardImport.getCardSymbol(); //卡代号
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//取得充值卡类型值和面额值
SysPublictype cardType = (SysPublictype)session.get(SysPublictype.class, sysCardImport.getCardType());
SysPublictype cardMoney = (SysPublictype)session.get(SysPublictype.class, sysCardImport.getCardMoney());
temp+=cardType.getVchvalue();
temp+=cardMoney.getVchvalue();
String templeng[]=sysCardImport.getPasswordChar();
for(int len=0;len<templeng.length;len++){ //循环遍历充值卡加密字符串
String temparray[]=templeng[len].split(":");
String temps=temp+temparray[0]; //加密字符串代码
long cardnum=0;
List list= session.createQuery(" from SysCard t where t.vchcode like ? order by t.vchcode desc")
.setString(0, ""+temps+"%").list();
if(list.size()>0){
SysCard card=(SysCard)list.get(0);
cardnum = Long.valueOf(card.getVchcode().substring(10));
}
for(int num=0;num<sysCardImport.getCardAmount();num++){ //生成充值卡卡号
String cardroand="000000000"+(++cardnum);
cardroand=cardroand.substring(cardroand.length()-10);
SysCard sysCard=new SysCard();
SysPassword sysPassword=new SysPassword();
String password=BJFYSystemUtil.getRandomString(sysCardImport.getCardPasswordLength(),2);
sysCard.setVchcode(temps+cardroand);
sysCard.setNummoney(sysCardImport.getCardMoneys());
sysCard.setCstate("10");
sysCard.setDatcreate(date);
sysCard.setDatavailability(sdf.parse(sysCardImport.getCardDate()));
sysCard.setVchremark(sysCardImport.getCardRemark());
sysCard.setVchpassword(BJFYSystemUtil.getMD5(password+temparray[1]));
sysCard.setNumscale(sysCardImport.getCardScale());
sysCard.setVarkey(temparray[1]);
sysCard.setVchtype(cardType.getId());
sysPassword.setVchcode(temps+cardroand);
sysPassword.setVchpassword(password);
sysPassword.setVchpasschar(temparray[1]);
session.save(sysPassword);
session.save(sysCard);
if ((i + 1) % 1000 == 0) {
session.flush();
session.clear();
}
i++;
}
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
flag = false;
}
return flag;
}
});
return bool;
}
下面是JDBC批处理的代码:
public boolean addCardListByJdbc( final SysCardImport sysCardImport,final Date date){
boolean flag=true;
Connection con= this.hibernateTemplate.getSessionFactory().openSession().connection();
PreparedStatement stm=null;
PreparedStatement stm2=null;
try {
int i=0;
String temp=sysCardImport.getCardSymbol(); //卡代号
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//取得充值卡类型值和面额值
SysPublictype cardType = (SysPublictype)hibernateTemplate.get(SysPublictype.class, sysCardImport.getCardType());
SysPublictype cardMoney = (SysPublictype)hibernateTemplate.get(SysPublictype.class, sysCardImport.getCardMoney());
temp+=cardType.getVchvalue();
temp+=cardMoney.getVchvalue();
con.setAutoCommit(false);
stm=con.prepareStatement("insert into sys_card values(?,?,?,?,?,?,?,?,?,?)");
stm2=con.prepareStatement("insert into sys_password values(?,?,?)");
String templeng[]=sysCardImport.getPasswordChar();
for(int len=0;len<templeng.length;len++){ //循环遍历充值卡加密字符串
String temparray[]=templeng[len].split(":");
String temps=temp+temparray[0]; //加密字符串代码
long cardnum=0;
List list= hibernateTemplate.find(" from SysCard t where t.vchcode like ? order by t.vchcode desc", temps+"%");
if(list.size()>0){
SysCard card=(SysCard)list.get(0);
cardnum = Long.valueOf(card.getVchcode().substring(10));
}
for(int num=0;num<sysCardImport.getCardAmount();num++){ //生成充值卡卡号
String cardroand="000000000"+(++cardnum);
cardroand=cardroand.substring(cardroand.length()-10);
SysCard sysCard=new SysCard();
SysPassword sysPassword=new SysPassword();
String password=BJFYSystemUtil.getRandomString(sysCardImport.getCardPasswordLength(),2);
stm.setString(1,temps+cardroand);
stm.setString(2, BJFYSystemUtil.getMD5(password+temparray[1]));
stm.setLong(3, sysCardImport.getCardMoneys());
stm.setLong(4, sysCardImport.getCardScale());
stm.setString(5,cardType.getId() );
stm.setDate(6, new java.sql.Date(System.currentTimeMillis()));
stm.setDate(7, new java.sql.Date(date.getTime()));
stm.setString(8, "10");
stm.setString(9, temparray[1]);
stm.setString(10, sysCardImport.getCardRemark());
stm.addBatch();
stm2.setString(1, temps+cardroand);
stm2.setString(2, password);
stm2.setString(3,temparray[1]);
stm2.addBatch();
if ((i + 1) % 1000 == 0) {
stm.executeBatch();
stm2.executeBatch();
con.commit();
}
i++;
}
}
if(stm!=null) {
stm.executeBatch();
stm2.executeBatch();
con.commit();
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
flag = false;
}finally{
try {
con.close();
stm=null;
stm2=null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return flag;
}
综上所述,hibernate的批量更新和插入要创建和销毁大量的对象,尤其是带有复杂业务逻辑的,所以本人建议在大批量导入和更新时,最好使用JDBC的批处理.在批处理上hibernate和jdbc Batch不是一个等级的。
分享到:
相关推荐
### Hibernate批量处理详解 #### 一、批量处理概述 Hibernate作为一种强大的对象关系映射(ORM)框架,提供了多种批量处理的方式以提高数据处理效率。批量处理对于需要在短时间内处理大量数据的应用尤其重要,如...
当达到预设的数量时,Hibernate会自动将操作批量提交到数据库。批处理在插入大量数据或执行重复更新时尤其有用。 5. **批处理测试**:测试批处理操作时,我们关注的是批处理的正确性、性能和边界情况。例如,测试...
Struts2批量插入是Web开发中常见的操作,主要用于提高数据处理效率,特别是在处理大量数据时。Struts2作为一款流行的Java MVC框架,提供了强大的功能来支持这种操作。本篇文章将深入探讨Struts2如何实现批量插入,并...
2. **批处理**: 批量插入、更新,提高数据库操作效率。 3. **延迟加载(Lazy Loading)**: 只在需要时加载关联对象,避免加载过多数据。 4. **集合分页**: 使用Query的setFirstResult()和setMaxResults()方法进行...
2. **批量操作**:批量插入、更新和删除功能可以显著提高数据处理速度,特别是在大数据量的场景下。 3. **动态模型**:允许在运行时动态创建和修改实体类,适应多变的数据结构需求。 4. **时间戳和版本管理**:...
在`hibernate-batch-size-test-master`这个项目中,可能包含了示例代码,模拟了批量插入的过程。你可能需要做以下步骤: 1. 配置Hibernate:在`hibernate.cfg.xml`或相应的配置文件中,设置`hibernate.jdbc.batch_...
13.1. 批量插入(Batch inserts) 13.2. 批量更新(Batch updates) 13.3. StatelessSession (无状态session)接口 13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1....
- **批处理**:批量处理操作可以显著提高性能,如批量插入和更新。 - **对象关系映射**:谨慎设计实体之间的关系,避免N+1查询问题。 7. **注意事项** - **空指针异常**:处理null值时要格外小心,避免因未初始...
7. 支持批量操作:Hibernate4支持批处理,比如批量插入、更新和删除,这在处理大量数据时非常有用。 8. 异步操作:Hibernate4可以通过集成JPA(Java Persistence API)的批处理和多线程特性实现异步操作,提升系统...
13.1. 批量插入(Batch inserts) 13.2. 批量更新(Batch updates) 13.3. StatelessSession (无状态session)接口 13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1....
13.1. 批量插入(Batch inserts) 13.2. 批量更新(Batch updates) 13.3. StatelessSession (无状态session)接口 13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1....
- **批量插入**:通过批量操作提高数据处理效率,尤其是在大量数据导入的情况下。 - **批量更新**:批量执行更新操作,减少网络往返次数。 - **无状态Session**:用于执行批处理操作,不需要维护任何会话状态。 - **...
13.1. 批量插入(Batch inserts) 13.2. 批量更新(Batch updates) 13.3. StatelessSession (无状态session)接口 13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1....
13.1. 批量插入(Batch inserts) 13.2. 批量更新(Batch updates) 13.3. StatelessSession (无状态session)接口 13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小...
2. 使用JDBC:如果一级缓存仍然无法满足需求,可以考虑直接使用JDBC批量插入,这能更有效地控制内存使用和数据库交互。 3. 数据导入工具:对于非常大的数据量,可以寻找特定于数据库的导入工具,如MySQL的LOAD DATA...
- **批量操作**:支持批量插入、更新等操作,减少数据库交互次数,提升性能。 #### 六、性能优化技巧 - **批处理**:通过设置`batch_size`属性来控制一次网络请求中包含的操作数量。 - **事务隔离级别**:根据业务...
批量插入(Batch inserts) 13.2. 批量更新(Batch updates) 13.3. StatelessSession (无状态session)接口 13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小...
10. **性能优化**:整合Spring和Hibernate后,我们可以通过配置和最佳实践优化性能,如批量操作、延迟加载、缓存策略等。 总的来说,Spring整合Hibernate能带来更优雅的代码结构、强大的事务管理和灵活的数据库操作...