jsp使用JDBC在MySQL数据库中快速批量插入数据(几万行数据)
jsp使用JDBC在MySQL数据库中快速批量插入数据(几万行数据)
最近有个简单的作业,就是一个从数据库中取出数据来进行判断,然后输出到jsp页面。 当我用Statement来进行插入的时候,效率很慢。简直不能忍。
以下贴出简单的java中插入数据库的Statement代码
代码块
int sum[]=new int[hang1];
for(int i = 0 ; i < hang1 ; i++){//循环读取数据库中每一行
for(int j = 1 ; j<10 ;j+=2){//循环读取读取每一行中的每个value列
if(data[i][j].equals("")){//判断当前value是否为空
continue;
}
for(int k =0;k<hang;k++){
if(data[i][j].equals(data2[k][0])){
sum[i]+=Integer.parseInt((String) data[i][j+1])*Integer.parseInt((String) data2[k][1]);
String sqlcunru = "insert into records (uid,ke,url) values ('"+data[i][0]+"','"+sum[i]+"','"+data[i][11]+"')";
stmt.execute(sqlcunru);//得到结果集
conn.commit();
}else{
continue;
}
}
}
}
String sqls = "select * from crawler.records";//查询语句
ResultSet rsz = stmt.executeQuery(sqls);//得到结果集
int shang = rsz.getRow();
System.out.println(shang);
if(shang==0){
//System.out.println(data[0][0]);
String sqlcunrus = "insert into records (uid,ke,url) values ('查询出错','0','未匹配到关键字,请重新输入!!!')";
stmt.execute(sqlcunrus);//得到结果集
conn.commit();
stmt.close();
conn.close();
return;
}
里面或许有错误,先不管了。。。
程序是按照用户输入的字,然后用fnlp分词后查询数据库的内容。
以下是查询的时间
就两个词语,管理中心
<br>与数据库中的大数据进行比较耗时 : 89.444 秒
<br>完成总时间耗时 : 90.492 秒
这怎么能忍呢,就百度PreparedStatement 处理会不会比Statement快,没想到快很多。
以下是修改后PreparedStatement 的代码。
String sqlcunru = "insert into records (uid,ke,url) values (?,?,?)";
PreparedStatement psts = conn.prepareStatement(sqlcunru);
int sum[]=new int[hang1];
for(int i = 0 ; i < hang1 ; i++){//循环读取数据库中每一行
for(int j = 1 ; j<10 ;j+=2){//循环读取读取每一行中的每个value列
if(data[i][j].equals("")){//判断当前value是否为空
continue;
}
for(int k =0;k<hang;k++){
if(data[i][j].equals(data2[k][0])){
sum[i]+=Integer.parseInt((String) data[i][j+1])*Integer.parseInt((String) data2[k][1]);
psts.setString(1,(String) data[i][0]);
psts.setInt(2, sum[i]);
psts.setString(3, (String) data[i][11]);
psts.addBatch();
}else{
continue;
}
}
}
}
psts.executeBatch(); // 执行批量处理
conn.commit(); // 提交
String sqls = "select * from crawler.records";//查询语句
ResultSet rsz = stmt.executeQuery(sqls);//得到结果集
int shang = rsz.getRow();
System.out.println(shang);
if(shang==0){
//System.out.println(data[0][0]);
String sqlcunrus = "insert into records (uid,ke,url) values ('查询出错','0','未匹配到关键字,请重新输入!!!')";
stmt.execute(sqlcunrus);//得到结果集
conn.commit();
stmt.close();
conn.close();
return;
}
也是查询了两个词语。管理中心
<br>与数据库中的大数据进行比较耗时 : 25.571 秒
<br>完成总时间耗时 : 26.305 秒
咦。。看起来快了许多。但是心里还是感觉慢。那就继续百度呗。。
发现了这样一段代码。。
url+="?useServerPrepStmts=false&rewriteBatchedStatements=true";
加到数据库连接后面。继续来测试。。竟然又快了快一倍。
<br>与数据库中的大数据进行比较耗时 : 14.593 秒
<br>完成总时间耗时 : 15.291 秒
以上的 useServerPrepStmts 和 rewriteBatchedStatements 在百度上可以搜索到原因是为什么。这里篇幅已经很长,就不在赘述了。
代码应该是可以看懂。不懂可以留言问我。