首页 > 其他分享 >hibernate 批量插入的测试 转

hibernate 批量插入的测试 转

时间:2023-05-16 16:31:35浏览次数:30  
标签:hibernate 批量 get sysCardImport 插入 SysPublictype card


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,批量,get,sysCardImport,插入,SysPublictype,card
From: https://blog.51cto.com/u_16115638/6285347

相关文章

  • mongoDB 批量将某个字段值等于另一个字段值
    将update_time字段的值设置为create_time的值:db.collection_name.find().forEach(function(item){db.collection_name.update({_id:item._id,create_time:{$exists:true}},{$set:{update_time:item.create_time}})}......
  • hibernate Restrictions用法
    [url]http://xuganggogo.iteye.com/blog/440078[/url]QBC常用限定方法[b]Restrictions.eq-->equal,等于.Restrictions.ne-->不等于Restrictions.allEq-->利用Map来进行多个等于的限制,参数为Map对象,使用key/value进行多个等于的比对,相当于多个Re......
  • C++黑马程序员——P207-209. deque容器 插入和删除,数据存取,排序操作
    P207.deque容器——插入和删除P208.deque容器——数据存取P209.deque容器——排序操作P207.deque插入和删除 ————————————————————————————————————————————————————————1#include<iostream>2#......
  • Android App中检测USB是否插入
    一、需求在Android开发过程中,在App中实现检测USB是否插入。二、实现过程1、使用UsbManager.ACTION_USB_DEVICE_DETACHED和UsbManager.ACTION_USB_DEVICE_ATTACHED检测USB的插拔无法实现。2、使用UsbManager.ACTION_USB_STATE和UsbManager.ACTION_USB_CONNECTED1privateb......
  • Hibernate之update(1)——更新部分字段
    Hibernate中如果直接使用Session.update(Objecto),会把这个表中的所有字段更新一遍。如果你没有对你需要更新的字段以外的字段赋值,那么这些字段会被置空。publicclassTeacherTest{@Testpublicvoidupdate(){Sessionsession=HibernateUitl.getSession......
  • 阿里图标库批量下载iOS适配的图标
    没有UI设计师精湛的技艺,很难设计出符合业务场景的图标,作为开发,确实拙计。练手的项目可以完全可以降低标准,不必达到看图识意,生产上在再请专业UI出图也不失是一个好的方案。阿里巴巴矢量图标库,就给了我们极大方便,......
  • 批量备份docker镜像
    首先,停止所有正在运行的容器dockerstop$(dockerps-a-q)列出所有停止的容器ID并写入list.txt文件dockerps-a--filter"status=exited"-q>list.txt编写bash脚本并运行#!/bin/bashwhilereadcontainer_id;doecho"Exportingcontainer$container_id..."......
  • MySQL(四) 数据表的插入、更新、删除数据
    一、插入数据格式:INSERTINTO表名(字段名...)VALUES(值...);创建环境使用person表CREATETABLEperson(idINTUNSIGNEDNOTNULLAUTO_INCREMENT,nameCH......
  • 【按文分图工个】可以根据图片中的文字来批量自动分类的软件
    9-4在有些日常工作中,经常会接收到某种类型的非常多的图片,然后要按图片上的文字,对这些图片做分类,比如水印机机拍的、环卫工人巡街拍的、甚至是卫星拍的图片,就有不少特定特征的文字,可以用本文章的方法,通过区分图片上文字的方法,快速分类。比如下面的图,图片非常多,是来自卫星图像处理的......
  • linux 中 批量删除文件后缀
     001、rename[root@PC1test]#ls1.csv2.csv3.csva.txtb.txtc.txt[root@PC1test]#rename".txt"""*.txt##删除.txt后缀[root@PC1test]#ls1.csv2.csv3.csvabc[root@PC1test]#rename".csv"""......