最近在討論中,我被問: 你有一個平面文件包含許多記錄說500萬。 您需要編寫一個Java程序,可以從該文件中獲取記錄,並通過JDBC將其存儲在數據庫中。 什麼是最有效的方法?更有效的方法來存儲文件記錄
我的建議是建立:
- 一個線程將要處理的JDBC連接(還可以使連接類單)
- 另一個線程將在表中提取從文件&記錄保存。
- 此外,當某個數量的記錄保存在數據庫中時,比如說100,然後提交這些記錄,然後繼續。
這裏存儲過程會更好還是有其他方法?
最近在討論中,我被問: 你有一個平面文件包含許多記錄說500萬。 您需要編寫一個Java程序,可以從該文件中獲取記錄,並通過JDBC將其存儲在數據庫中。 什麼是最有效的方法?更有效的方法來存儲文件記錄
我的建議是建立:
這裏存儲過程會更好還是有其他方法?
好問題。使用準備好的語句很重要,因爲它將減少每個插入的開銷。你當然不希望它每次都解析「插入等等」。我不會擔心管理線程來讀取文件等等,這就是操作系統爲你做的。只需通過緩衝區讀取文件的大塊,並從中進行插入。您可能會考慮通過產生多個插入程序任務實例來將文件分成塊,這些插入程序任務首先通過搜索文件並從那裏讀取塊。操作系統應該緩衝讀取,以便尋找不會變差。當然,如果您的數據庫不在RAID或至少另一個捲上,則所有投注都將關閉。只是一些想法攪拌鍋...
我不會說任何「開銷」僅限於查詢解析。 –
@YourCommonSense - 同意,解析當然只是它的一部分。 – bitfiddler
聽起來像你有正確的做法。
花費在網絡I/O和數據庫操作上的成本和時間將遠遠大於平面文件上花費的文件IO和解析時間。有一個單獨的線程讀取文件併爲數據庫準備一個記錄可能會有一些小的性能增益,但它可能不值得增加複雜性,也許不值得JVM花費在線程管理上的時間。我推薦:
preparedStatement.addBatch()
),並且每N個記錄提交一批(preparedStatement.executeBatch()
)。你可能想要原型來看看「N」的理想值是多少,但100是一個很好的開始。我不建議存儲過程。如果你只是做直接插入,他們不會爲你做很多事情。
如果你只是加載文件的文件,Oracle有批處理文件加載器,這是更有效的。或者,您可以加載到臨時表並使用SQL來轉換文件 –