JDBC批量执行非常缓慢

7

请问我做错了什么,我在mysql中执行了350个插入操作,但需要40秒才能完成。

以下是代码:

long t0 = System.currentTimeMillis();
        Connection con = connectionProvider.getConnection();
        PreparedStatement s = con.prepareStatement("insert into domkee.friends(idFriends,friend1Id,friend2Id,friend2Name) values(?,?,?,?)");
        con.setAutoCommit(false);
        for (Friend f : friends) {
            s.setLong(1, 0);
            s.setLong(2, f.getFriend1Id());
            s.setLong(3, f.getFriend2Id());
            s.setString(4, f.getFriend2Name());
            s.addBatch();

        }
        long t1 = System.currentTimeMillis() - t0;
        s.executeBatch();
        long t2 = System.currentTimeMillis()-t0;
        con.commit();
        long t3 = System.currentTimeMillis()-t0;
        s.close();
        con.close();
        long t4 = System.currentTimeMillis()-t0;
        System.out.println(((double)t1/1000) + ";" + ((double)t2/1000) + ";" + ((double)t3/1000) + ";" + ((double)t4/1000));

以下是控制台输出:

0.156;39.251;39.376;39.486

执行.executeBatch()需要大约40秒钟的时间,可能有什么问题呢?


2
所以我认为这与JAVA无关,我认为你的服务器很慢。 - Shamis Shukoor
也许是您的限制导致查询时间过长?您是否运行了Explain并执行了查询? - Hiro2k
@Hiro2k,EXPLAIN只适用于SELECT语句吗? - fernandohur
@Woojah 是的,因为MySQL Workbench也需要大约相同的时间,所以这与硬件有关。要使其更快,请增加服务器的RAM或其他硬件设备。 - Shamis Shukoor
@sheldonCooper,它说一个小实例(像我的)具有以下特点:小型DB实例:1.7 GB内存,1 ECU(1个虚拟核心和1个ECU),64位平台,中等I/O容量。它不应该那么慢,或者我错了吗? - fernandohur
显示剩余6条评论
1个回答

18
?rewriteBatchedStatements=true添加到您的JDBC URL末尾,它会显著提高性能。请注意,这仅适用于MySql,对其他任何JDBC驱动程序都没有影响。

1
更多详情请参见:http://slava-technical.blogspot.com/2010/07/mysql-batch-queries-processing.html - jtahlborn
以上建议非常棒。 - Ironluca
@jtahlborn 那个博客只对受邀请的读者开放。请修复它,或者将其公开。 - Sibidharan
@Sibidharan 我并不能控制博客文章,网上有很多其他地方提供更详细的信息。 - jtahlborn
嗨,我尝试在Oracle中使用此解决方案,但无法使用。请帮忙。https://stackoverflow.com/questions/46969005/how-to-use-rewritebatchedstatements-true-with-jdbc-and-oracle - Abdul
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接