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