@Test
public void transaction() throws Exception {
Connection conn = null;
PreparedStatement ps = null;
try {
String sql = "insert into `1` values(?, ?, ?, ?)";
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
conn.setAutoCommit(false);
for(int i = 1; i <= 10000; i ){
ps.setObject(1, i);
ps.setObject(2, 10.12345678);
ps.setObject(3, "num_" i);
ps.setObject(4, "2021-12-24 19:00:00");
ps.addBatch();
}
ps.executeBatch();
ps.clearBatch();
conn.commit();
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
}finally {
JDBCUtils.closeResources(conn, ps);
}
}
當 setAutoCommit = true 時,本地 MySQL 和分布式 MySQL 插入速度非常慢。
當我手動將事務設定為commit時,就像上面的代碼一樣,本地MySQL的速度提高了很多,但是分布式MySQL的插入速度還是很慢。
我需要設定任何其他引數嗎?
uj5u.com熱心網友回復:
設定引數可能不會有幫助(很多)。
速度慢有兩個原因:
與
autocommit=true您一起提交每個插入陳述句。這意味著在資料庫服務器將回應回傳給客戶端之前,必須將每個新行寫入磁盤。隨著
autocommit=false仍有客戶端- >服務器- >客戶端一輪每趟insert宣告。這些往返行程加起來很長。
加快速度的一種方法是在每個插入陳述句中插入多行,但這很麻煩,因為您需要生成復雜的(多行)插入陳述句。
更好的方法是使用 JDBC 的批處理特性來減少往返次數。例如:
PreparedStatement ps = c.prepareStatement("INSERT INTO employees VALUES (?, ?)");
ps.setString(1, "John");
ps.setString(2,"Doe");
ps.addBatch();
ps.clearParameters();
ps.setString(1, "Dave");
ps.setString(2,"Smith");
ps.addBatch();
ps.clearParameters();
int[] results = ps.executeBatch();
(歸因:以上代碼從@Tusc 的這個答案中復制)
如果這還不夠快,您應該使用 MySQL 的原生批量插入機制獲得更好的性能;例如load data infile; 請參閱MySQL 的高速插入
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393648.html
