2011-06-27 74 views
0

我有一個需要讀取一個Excel文件的標題和數據,並在數據庫(MySQL)中創建一個基於表頭和從文件中提取的值的表。爲此,我使用JDBC在數據庫表中創建和插入數據(使用準備語句)。如何優化使用java插入數據的處理速度?

它可以很好地工作,但是當記錄數量增加時 - 假設文件包含200000或更多記錄 - 它會變得很慢。請指導我如何優化將數據插入數據庫表的處理速度。

感謝,Sameek

+0

更改爲帶有大型機的Oracle DB。 –

+0

..我想,單個Excel表格不能容納更多的65535條記錄(行) –

+0

@Andreas_D:的確如此。我想他會爲每個Excel行插入多行或其他東西......(或者他可能使用了多張表格) – helios

回答

6

爲了優化它,你應該先使用同一個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(); 
+0

+1 - 我瞭解到人們有時會忘記,我們*準備*聲明*(重新)使用*它一次又一次(當然,這裏可能不是這樣) –

1

將插入包裝在事務中。僞代碼:

1)開始交易 2)創建準備語句 3)迴路的所有刀片,設置準備語句參數和每個執行插入 4)提交事務

0

我帶的例子冬眠。 Hibernate有一個名爲HibernateSession的概念,它存儲尚未發送到數據庫的SQL命令。 使用Hibernate,您可以插入並刷新每100次插入的會話,這意味着每100次插入一次就發送SQL查詢。這有助於獲得性能,因爲它每隔100次插入就與數據庫進行通信,而不是每次插入。

所以你可以通過每100(或者你想要什麼)執行executeUpdate來做同樣的事情或者使用preparedStatement。