数据库
首页 > 数据库> > java-最佳实践是在单个事务中将50000条记录存储在mysql中

java-最佳实践是在单个事务中将50000条记录存储在mysql中

作者:互联网

输入集:数千(> 10000)个csv文件,每个文件包含> 50000项.
输出:将这些数据存储在mysql db中.

采取的方法:
读取每个文件并将数据存储到数据库中.以下是相同的代码段.请建议这种方法是否可行.

    PreparedStatement pstmt2 = null;
try 
{
pstmt1 = con.prepareStatement(sqlQuery);
result = pstmt1.executeUpdate();
con.setAutoCommit(false);
sqlQuery = "insert   into "
        + tableName
        + " (x,y,z,a,b,c) values(?,?,?,?,?,?)";
pstmt2 = con.prepareStatement(sqlQuery);
Path file = Paths.get(filename);

lines = Files.lines(file, StandardCharsets.UTF_8);
final int batchsz = 5000;
for (String line : (Iterable<String>) lines::iterator) {

    pstmt2.setString(1, "somevalue");
    pstmt2.setString(2, "somevalue");
    pstmt2.setString(3, "somevalue");
    pstmt2.setString(4, "somevalue");
    pstmt2.setString(5, "somevalue");
    pstmt2.setString(6, "somevalue");
    pstmt2.addBatch();
    if (++linecnt % batchsz == 0) {
        pstmt2.executeBatch();
    }
}
int batchResult[] = pstmt2.executeBatch();
pstmt2.close();
con.commit();

} catch (BatchUpdateException e) {
    log.error(Utility.dumpExceptionMessage(e));

} catch (IOException ioe) {
    log.error(Utility.dumpExceptionMessage(ioe));
} catch (SQLException e) {
    log.error(Utility.dumpExceptionMessage(e));
} finally {
    lines.close();
    try {
        pstmt1.close();
        pstmt2.close();
    } catch (SQLException e) {
        Utility.dumpExceptionMessage(e);
    }
}

解决方法:

正如@Ridrigo指出的那样,LOAD DATA INFILE是必经之路.根本不需要Java.

如果CSV格式不是可以直接插入数据库的格式,则Java代码可以租用图片.使用它来重组/转换CSV并将其另存为另一个CSV文件,而不是将其写入数据库.

您还可以使用Java代码遍历包含CSV的文件夹,然后对

Runtime r = Runtime.getRuntime();
Process p = r.exec("mysql -p password -u user database -e 'LOAD DATA INFILE ....");

您会发现这比为CSV文件的每一行运行单独的sql查询要快得多.

标签:load-data-infile,java,mysql
来源: https://codeday.me/bug/20191118/2030752.html