将批量元素插入数据库

时间:2016-08-01 10:40:31

标签: java mysql sql

所以我尝试将HashMap中的所有键输入到数据库中。我的第一种方法是将所有密钥逐个插入我的数据库。请注意,HashMap的大小是几百万个密钥,因此这个过程需要花费很多时间。

我做了一些研究,偶然发现了 preparedStatement 界面。所以我想出了这段代码来创建10000个元素的批处理,然后将它们全部输入到数据库中。

final int batchSize = 10000;
int count = 0;
Connection dbConnection = null;
try {
    dbConnection = getDBConnection();
    String SQL = "INSERT INTO masterdict (window) " +
                 "VALUES(?)";

    PreparedStatement ps = (PreparedStatement) dbConnection.prepareStatement(SQL);

    for (String k : masterDict.keySet()) {
        ps.setString(1,k);
        ps.addBatch();
        if(++count % batchSize == 0) {
            System.out.println(count);
            ps.executeBatch();
        }
    }
    ps.executeBatch();
    ps.close();
    dbConnection.close();

由于某种原因,尽管这种方法与第一种方法完全相同。任何人都可以向我解释为什么会这样?

1 个答案:

答案 0 :(得分:0)

阅读完评论后,我最终得到了这个新版本的代码,效果很好。

final int batchSize = 10000;
    int count = 0;
    Connection dbConnection = null;
    try {
        dbConnection = getDBConnection();
        String SQL = "INSERT INTO masterdict (window) " +
                 "VALUES(?)";

        PreparedStatement ps = (PreparedStatement) dbConnection.prepareStatement(SQL);
        dbConnection.setAutoCommit(false);
        for (String k : masterDict.keySet()) {
            ps.setString(1,k);
            ps.addBatch();
            if(++count % batchSize == 0) {
                System.out.println(count);
                ps.executeBatch();
                dbConnection.commit();
            }
        }
        ps.executeBatch();
        dbConnection.commit();
        ps.close();

    } catch (SQLException e) {
        if (dbConnection != null) {
            dbConnection.rollback();
        }
        System.out.println(e.getMessage());

    } finally {
        dbConnection.close();
    }