Java大批量数据导入到Oracle…

近来在做一些大批量数量导入数据库的操作,学习了一种简单的方式,与大家分享交流:

http://saluya.iteye.com/blog/1420821查看MyEclipse内存的,大家参见一下。

我是利用JDBC自己的Batch操作来控制 插入条数  ,然后实现大批量快速导入数据:

下面是普通插入方式:

public boolean insert(Code c) {
       Stringsql = "insert into testCode values(?,?)";
      conn = ConnectionUtil.getConnection();
      try {
         psmt = conn.prepareStatement(sql);
          psmt.setString(1,c.getAcaCode());
         psmt.setString(2, c.getRefCode());
    int a =psmt.executeUpdate();
   if(a==1){
    return true;
    }
  } catch (SQLException e){
   e.printStackTrace();
  }finally{
   try {
    psmt.close();
    conn.close();
   } catch(SQLException e) {
    e.printStackTrace();
   }
  }
  return false;
 }

 

这种方式,插入数据库不超过1000条还好,但是如果数据量超过100万,就不行了,几个小时可能都没执行完成,所以下面的方式将超乎想象的缩短时间:

     public boolean insert1(String[] arr1,String[]arr2) {
  String sql = "insert intotestCode values(?,?)";
  conn =ConnectionUtil.getConnection();
  try {
   conn.setAutoCommit(false);
   psmt = conn.prepareStatement(sql);
   for(int i = 0;i
    psmt.setString(1, arr1[i]);
    psmt.setString(2, arr2[i]);
    psmt.addBatch();
    if(i00==0||i==arr1.length-1){
     psmt.executeBatch();
     conn.commit();
    }
   }
   return true;
  } catch (SQLException e){
   try {
    conn.rollback();
   } catch(SQLException e1) {
    //TODO Auto-generated catch block
    e1.printStackTrace();
   }
   e.printStackTrace();
  }finally{
   try {
    if(psmt!=null){
     psmt.close();
    }
    if(conn!=null){
     conn.close();
    }
   } catch(SQLException e) {
    e.printStackTrace();
   }
  }
  return false;
 }

        其中,i模的数可以自定义,在网上很多地方说100左右,但是我试验的时候,1000才最好,不过可能由于各种机器、环境等因素影响,大家可以试试,差不多就行了;

        这种方式在我电脑上运行8秒左右,就把100万条记录轻轻松松插入到数据库中了,不过是两个14位的varchar2字段,不是很多,占用32兆的数据库空间。时间与字段多少也有关系的...

 

       另外,我的这种方式基于可以容纳这样的数组,或者说是对象,很多人的MyEclipse容纳不了100万个数据存储在JVM内存中,所以这时可以扩展JVM内存,扩展方式,网上很容易找,就不介绍了...

 

        如有不当之处,欢迎指正!!!

猜你喜欢

转载自blog.csdn.net/hulufeng1203/article/details/14167103
今日推荐