Insert语句包含1000多个元素

时间:2018-04-20 15:25:22

标签: java sql string jdbc set

我正在尝试使用JDBC向数据库添加100,000个名称。我知道MS SQL不允许超过1000,elmts的大量插入,所以我通过将主要设置分成包含1000或更少的集合来实现这一点。以下是我的代码:

StringJoiner joiner = new StringJoiner("\'), (\'", "INSERT INTO Names (Name) VALUES (\'", "\');");
    ExecutorService threadpool = Executors.newFixedThreadPool(100);
    while(names.size() > 0) {

        int count = Math.min(1000, names.size());
        HashSet<String> set = new HashSet();
        Iterator iterator = names.iterator();
        for(int i = 0; i < count; i++) {
           set.add((String) iterator.next());
        }
        names.removeAll(set);
        for(String s: set)
        {
            joiner.add(s);
        }
       // System.out.println(joiner.toString());

        threadpool.submit(() -> {
            PreparedStatement query = null;
            try {
                query = connect.prepareStatement(joiner.toString());
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                query.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        });

    }


}

这会引发以下异常:com.microsoft.sqlserver.jdbc.SQLServerException: The number of row value expressions in the INSERT statement exceeds the maximum allowed number of 1000 row values.

为什么要添加超过1000行?

1 个答案:

答案 0 :(得分:0)

为什么不使用批量插入?定义批量大小1000并一次在1000个查询的批量中插入查询。

String sql = "insert into names(name) values (?)";
Connection connection = new getConnection();
PreparedStatement ps = connection.prepareStatement(sql);

final int batchSize = 1000;
int count = 0;

for (Employee employee: employees) {

    ps.setString(1, employee.getName());
    ps.addBatch();

    if(++count % batchSize == 0) {
        ps.executeBatch();
    }
}
ps.executeBatch(); // insert remaining records
ps.close();
connection.close();