我有一個需要讀取一個Excel文件的標題和數據,並在數據庫(MySQL)中創建一個基於表頭和從文件中提取的值的表。爲此,我使用JDBC在數據庫表中創建和插入數據(使用準備語句)。如何優化使用java插入數據的處理速度?
它可以很好地工作,但是當記錄數量增加時 - 假設文件包含200000或更多記錄 - 它會變得很慢。請指導我如何優化將數據插入數據庫表的處理速度。
感謝,Sameek
我有一個需要讀取一個Excel文件的標題和數據,並在數據庫(MySQL)中創建一個基於表頭和從文件中提取的值的表。爲此,我使用JDBC在數據庫表中創建和插入數據(使用準備語句)。如何優化使用java插入數據的處理速度?
它可以很好地工作,但是當記錄數量增加時 - 假設文件包含200000或更多記錄 - 它會變得很慢。請指導我如何優化將數據插入數據庫表的處理速度。
感謝,Sameek
爲了優化它,你應該先使用同一個PreparedStatement對象中的所有刀片。
要進一步優化代碼,您可以發送批量更新。
例如5的批次:
//create table
PreparedStatement ps = conn.prepareStatement(sql);
for(int i =0; i < rows.length; ++i) {
if(i != 0 && i%5 == 0) {
pstmt.executeBatch();
}
pstmt.setString(1, rows[i].getName());
pstmt.setLong(2, rows[i].getId());
pstmt.addBatch();
}
pstmt.executeBatch();
+1 - 我瞭解到人們有時會忘記,我們*準備*聲明*(重新)使用*它一次又一次(當然,這裏可能不是這樣) –
將插入包裝在事務中。僞代碼:
1)開始交易 2)創建準備語句 3)迴路的所有刀片,設置準備語句參數和每個執行插入 4)提交事務
我帶的例子冬眠。 Hibernate有一個名爲HibernateSession的概念,它存儲尚未發送到數據庫的SQL命令。 使用Hibernate,您可以插入並刷新每100次插入的會話,這意味着每100次插入一次就發送SQL查詢。這有助於獲得性能,因爲它每隔100次插入就與數據庫進行通信,而不是每次插入。
所以你可以通過每100(或者你想要什麼)執行executeUpdate來做同樣的事情或者使用preparedStatement。
更改爲帶有大型機的Oracle DB。 –
..我想,單個Excel表格不能容納更多的65535條記錄(行) –
@Andreas_D:的確如此。我想他會爲每個Excel行插入多行或其他東西......(或者他可能使用了多張表格) – helios