近来在做一些大批量数量导入数据库的操作,学习了一种简单的方式,与大家分享交流:
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内存,扩展方式,网上很容易找,就不介绍了...
如有不当之处,欢迎指正!!!