为了账号安全,请及时绑定邮箱和手机立即绑定

while循环查询和更新数据的速度问题

while循环查询和更新数据的速度问题

一只萌萌小番薯 2019-03-13 16:15:54
每次循环会select出几千--几万不等的数据,然后对其处理后再更新回去。经过计算,每分钟才处理3000条数据左右,太慢了,请大家帮着查看。where条件很简单,应该不存在索引问题。是不是和数据库链接的建立有关系?请大家多多指教。代码大概如下:   Statement stmt_Select = con.createStatement();    Statement stmt_Update = con.createStatement();     while (***)     {              String sql = "select a, b, c from tablename where .......";            stmt_Select.close();                  stmt_Select=con.createStatement();            stmt_Update.close();                  stmt_Update=con.createStatement();                           rs = stmt_Select.executeQuery(sql);     int i = 0;       while (rs.next()){            // 这里会对select出来的值进行两次md5加密等      i = i + stmt_Update.executeUpdate("update tablename set a=......);       }            rs.close();       }
查看完整描述

5 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

    [i]stmt_Select.close();  [/i]    
           stmt_Select=con.createStatement(); 

          [i] stmt_Update.close();[/i]      
           stmt_Update=con.createStatement();

不要在循环里面频繁的close, 全部放在rs.close()之前
参考如下
stmt_Select.close();
stmt_Update.close();
rs.close();


查看完整回答
反对 回复 2019-04-26
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

PreparedStatement[quote] PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
[/quote]


查看完整回答
反对 回复 2019-04-26
?
大话西游666

TA贡献1817条经验 获得超14个赞

建议写个存储过程处理,你的业务也不算复杂。与数据库交互必然会耗费很多时间的。


查看完整回答
反对 回复 2019-04-26
?
米脂

TA贡献1836条经验 获得超3个赞

建议你使用Updatable statement,给你一段我以前写过的代码吧,这段代码用来处理14万条记录,具体时间记不太清了,不过效率还是挺高的:

[code="java"]
String sql = "select ccrq,dt_factory_date from ajdq";
Connection con = DbUtil._CONNECTION;//获得数据库连接
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = st.executeQuery(sql);
int i=0;
while(rs.next()){
String date = rs.getString(1);
Date d = DateUtil.parse(date);
if(d!=null){
rs.updateTimestamp(2, new Timestamp(d.getTime()));
rs.updateRow();
i++;
System.out.print(".");
if(i%100==0){
System.out.println(i);
con.commit();
}
}
}
rs.close();
st.close();
System.out.println();
System.out.println(i);
con.commit();
con.close();
[/code]


查看完整回答
反对 回复 2019-04-26
  • 5 回答
  • 0 关注
  • 878 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信