您的位置:首页 > 其它

jdbc批量插入

2016-05-19 07:54 211 查看
分享牛,分享牛原创。有这样一个需求,文本文件中的数据批量的插入mysql,怎么用jdbc方式批量插入呢?
jdbc默认提供了批量插入的方法,可能用一次就忘记了,这里做笔记记录一下jdbc批量插入吧。

1.1.1. 代码

Connection conn = null;

try {

Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cxjc", "root", "");
conn.setAutoCommit(false);
String sql = "insert into accout(id,NAME,money) values(?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
for(int i=1; i<3000; i++){

ps.setString(1, i+"");
ps.setString(2, i+"");
ps.setString(3, i+"");
//添加
ps.addBatch();

}
//执行
ps.executeBatch();
conn.commit();
}catch(Exception e){
}
}

1.1.2. 注意的地方

conn.setAutoCommit(false);
开启不支持事物,为什么要开启这个不支持事物的操作呢?这里主要是为了提高批量插入的效率,因为如果开启事物,那么mysql批量插入的时候,会产生一个log文件记录,每一条insert产生一个log记录,那这样其实跟单条sql的插入基本一样,所以关闭事务。这样性能提高可能是量级的提升。

1.1.3. 优化

当sql非常多的时候,我们可以查询到1000条sql的时候,就插入到数据库,这样保证每次插入的记录数就是批量插入一定的数量,而不是一次性非常多,代码的演变如下:
public static void main(String[] args) {
Connection conn = null;

try {

Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cxjc", "root", "");
conn.setAutoCommit(false);
String sql = "insert into accout(id,NAME,money) values(?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
for(int i=1; i<3000; i++){

ps.setString(1, i+"");
ps.setString(2, i+"");
ps.setString(3, i+"");
ps.addBatch();
//添加
if (i%1000==0) {
ps.executeBatch();
conn.commit();
}
}
//执行剩余的数据
ps.executeBatch();
conn.commit();
}catch(Exception e){
}

分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: