2017-09-15 33 views
1

我有一個包含超過100萬條記錄的csv文件。我想對這些記錄做一些處理,並將所有記錄保存在數據庫中。如何使用Spring-Data持續保存數百萬條記錄JPA

我嘗試了幾個選項。

  1. 保存在一個GO

    jpaepository.save(實體)的所有實體;

這種方法需要永遠,永遠不會競爭。適用於較小的記錄數。

  • 保存所有實體逐個

    entities.forEach(jpaRepository ::保存);

  • 這種方法完成,但花費了很多時間和內存使用在天空。

    +0

    什麼是底層數據庫?你確定數據庫不是瓶頸嗎? –

    +0

    使用類似Pentaho數據集成的ETL工具。說真的,你會爲自己節省很多頭痛。 – fhossfel

    +2

    請勿使用JPA。改用'LOAD DATA INFILE'。 https://stackoverflow.com/questions/14127529/mysql-import-data-from-csv-using-load-data-infile。這將使執行時間縮短到幾秒(如果偶數秒) – baao

    回答

    1

    這裏是我的建議,只是根據您的問題 -

    1. 創建,讀取文件的服務,說FileReaderService
    2. 創建寫入服務的記錄,一組數字說,1000在時間,我們稱之爲StorageService。將此注入FileReaderService
    3. @Transactional放在save_N_records方法的註釋上。
    4. 反覆致電StorageService.save_N_recordsFileReaderService。每當您打電話時,請確保您編寫日誌以監控進度。
    5. 如果完全可能的話,我會禁用表上的索引,所以插入速度更快,然後在插入完成後將其重新打開。當然,這在線上系統中是不可能的,只能在離線報告系統上使用。希望這可以幫助!
    +0

    我想這個過程是在一個事務。如果我把save_N_records上的Transactional,那麼這個方法將不斷刷新記錄到數據庫,如果有任何失敗,我該如何回滾完整的事務? – Pramod

    +0

    @Pramod,如果你希望整個事情成爲單一事務,那麼沒有大的重做日誌就很難做到這一點,因此加快速度。我會建議你嘗試在多個交易中分解它。祝你的項目好運。 – Prashant

    +0

    偉大的建議。謝謝。 – HopeKing

    相關問題