我想在不到一秒钟的时间内将大约10k条记录更新到mysql数据库中。我已经写了下面的代码,大约需要6-8秒才能将记录列表更新到数据库中。
public void updateResultList(List<?> list) {
String user = "root";
String pass = "root";
String jdbcUrl = "jdbc:mysql://12.1.1.1/db_1?useSSL=false";
String driver = "com.mysql.jdbc.Driver";
PreparedStatement pstm = null;
try {
Class.forName(driver);
Connection myConn = DriverManager.getConnection(jdbcUrl, user, pass);
myConn.setAutoCommit(false);
for(int i=0; i<list.size(); i++) {
Object[] row = (Object[]) list.get(i);
int candidateID = Integer.valueOf(String.valueOf(row[0]));
String result = String.valueOf(row[14]);
int score = Integer.valueOf(String.valueOf(row[19]));
String uploadState = (String) row[20];
String sql = "UPDATE personal_info SET result = ?, score = ?, uploadState = ? "
+ " WHERE CandidateID = ?";
pstm = (PreparedStatement) myConn.prepareStatement(sql);
pstm.setString(1, result);
pstm.setInt(2, score);
pstm.setString(3, uploadState);
pstm.setInt(4, candidateID);
pstm.addBatch();
pstm.executeBatch();
}
myConn.commit();
myConn.setAutoCommit(true);
pstm.close();
myConn.close();
}
catch (Exception exc) {
exc.printStackTrace();
try {
throw new ServletException(exc);
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
请让我知道您的意见,以优化此代码的性能改进。
3条答案
按热度按时间ou6hu8tu1#
您可以使用批处理将插入操作批处理到临时表中,而不是批处理单个更新
rewriteBatchedStatements=true
然后使用一条update语句来更新主表。在我的带有本地mysql示例的机器上,以下代码大约需要2.5秒。。。... 虽然此版本大约需要1.3秒:
a11xaf1n2#
首先,你需要初始化
prepareStatement
只有一次,你需要在for
环第二,你应该避免执行死刑
pstm.executeBatch();
对于每个循环,它将花费更多的资源,您需要执行指定的数量,如100500或更多,也不要在外部执行它for
只循环一次,因为这样会消耗更多的内存资源ibps3vxo3#
你的
pstm.executeBatch()
应该在之后for
环请参阅如何将列表插入数据库