java,jdbc,大量数据update更新效率很慢,哪位大神可怜可怜我吧

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java,jdbc,大量数据update更新效率很慢,哪位大神可怜可怜我吧相关的知识,希望对你有一定的参考价值。

数据库用的是mysql,部署在windows系统上。前提是不改变这两个条件。

String sql= "update table A= ?, B= ?, C= ? where D= ? and E= ? ";
字段D和E都建索引了。
BatchPreparedStatementSetter batch = new BatchPreparedStatementSetter()

@Override
public int getBatchSize()
return rtData.size();


@Override
public void setValues(PreparedStatement ps, int i) throws SQLException
Object[] obj = rtData.get(i);
ps.setObject(1, obj[0].toString());
ps.setObject(2, obj[1].toString());
ps.setObject(3, obj[2].toString());
ps.setObject(4, obj[3].toString());
ps.setObject(5, obj[4].toString());


;
int[] updateCounts = PConfigManageService.getJdbcTemplate().batchUpdate(sql,batch);

更新500条数据,需要20秒。太慢了。哪位大神可怜可怜我。尽量控制在5秒之内。

mysql使用jdbc的批量插入需要在连接Mysql的地方加上rewriteBatchedStatements=true
,也就是spring.datasource.url = jdbc:mysql://192.168.15.44:3306/ml_test?useSSL=false&useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true
,如果不加这个的话,和自己循环插入差不多
参考技术A 你试一下在更新前,把事务提交改成false,执行完更新语句后一次性提交,再把事务提交改回true追问

不行啊。我都快哭了。哎。

追答

有输出过运行时间吗?是怎么确定是数据库那块耗时长的?

追问

有,开始结束时间相减就是运行时间。

追答

这就不太清楚了,以往wo都是在执行连接前,设置conn.setAutoComit(false);
然后在batchUpdate之后conn.setAutoComit(true);那个BatchUpdate是自己封装的吗?代码怎么样的

追问

BatchUpdate是SpringJDBC,JdbcTemplate

追答

额,这样啊,spring不懂了,抱歉,帮不了你了

参考技术B 用循环批量添加addbatch(),循环外用ps.executeBatch();批量执行,你说的500条应该可以在10s以内完成,我测试的50000批次2分钟。 参考技术C where 多个条件是无法用单独的索引的,像你这种情况在D和E上建索引是不起作用的,应该建立D和E的联合索引才可以的 参考技术D 是不是类型转换的问题,就是你数据库字段和程序里面类型转换问题。
再说索引,试试建个联合索引试试?追问

都试过了。分批量update(每次100条更新),联合索引,指定类型,循环500次更新,但是时间上丝毫没有变化。都是20秒

Java批量插入更新操作

以前总是说批量插入和更新的效率比非批量的要高,但是一直没有使用过批量处理数据的功能,现在由于项目中需要处理的数据量比较大,所以使用了批量处理的功能,java代码如下:

1.java实现批量插入数据:

 Connection conn;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://192.168.0.200:3306/xxx", "root", "root");
            conn.setAutoCommit(false);
            String sql = "insert into test_user (u_name,create_date) value (?,SYSDATE())";
            PreparedStatement prest = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
            conn.setAutoCommit(false);

            for (int i = 1; i <= 100; i++) {
                prest.setString(1, "a" + i);
                prest.addBatch();
            }
            prest.executeBatch();
            conn.commit();


            conn.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

2.java实现批量更新数据:

Connection conn;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://192.168.0.200:3306/xxx", "root", "root");
            conn.setAutoCommit(false);

            // 保存当前自动提交模式
            boolean autoCommit = conn.getAutoCommit();
            // 关闭自动提交
            conn.setAutoCommit(false);
             Statement stmt =conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 

            for (int i = 1; i <= num; i++) {
                //通过遍历可以一次性插入多条sql语句
                stmt.addBatch("update test_user set test_user.u_name = (‘d"+i+"‘) where test_user.u_name = (‘c"+i+"‘)"); 
            }

            stmt.executeBatch();   
            stmt.clearBatch();
            conn.commit(); 
            conn.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }    

 

以上是关于java,jdbc,大量数据update更新效率很慢,哪位大神可怜可怜我吧的主要内容,如果未能解决你的问题,请参考以下文章

hibernate的update及JDBC数据库批量操作

java下连接mysql数据库 ——更新语句——update

廖雪峰Java15JDBC编程-3JDBC接口-2JDBC更新

SQL里怎么用UPDATE更新大量SELECT数据?

SQL里怎么用UPDATE 更新大量SELECT 数据

Java -- JDBC 学习--通过Statement进行数据库更新操作