簡體   English   中英

Java Spring:如何有效地從CSV文件讀取和保存大量數據?

[英]Java Spring: How to efficiently read and save large amount of data from a CSV file?

我正在Java Spring中開發一個Web應用程序,我希望用戶能夠從前端上載CSV文件,然后查看導入過程的實時進度,並且在導入之后,他應該能夠搜索單個條目從導入的數據。

導入過程將包括實際上傳文件(通過REST API POST請求發送),然后讀取文件並將其內容保存到數據庫中,以便用戶能夠從該數據中進行搜索。

將數據保存到數據庫的最快方法是什么? 僅遍歷各行並創建一個新的類對象,然后通過JPARepository為每行保存它會花費太多時間。 大約10,000條線路花了90年代。 我需要加快速度。 我需要在合理的時間內添加200k行。

注意事項:

我看到了使用Reactor的異步方法。 這應該更快,因為它使用多個線程,並且保存行的順序基本上並不重要(盡管數據在CSV中具有ID)。

然后,我還看到了Spring Batch作業,但是所有示例都使用SQL。 我正在使用存儲庫,因此不確定是否可以使用它,或者它是否是最佳方法。

GitHub存儲庫比較了5種不同的批量插入數據的方法。 累積 對他來說,使用JdbcTemplate最快(他聲稱在1.79 [+ -0.50]秒內記錄了500000條記錄)。 如果將JdbcTemplate與Spring Data結合使用,則需要創建一個自定義存儲庫; 有關詳細說明,請參閱文檔中的部分。

Spring Data CrudRepository有一個采用Iterablesave方法,因此您也可以使用它,盡管您必須定時查看它如何針對JdbcTemplate執行。 使用Spring Data,步驟如下(從此處進行一些編輯)

  1. 添加: rewriteBatchedStatements=true至連接字符串的末尾。
  2. 確保您使用的生成器支持實體中的批處理。 例如

     @Id @GeneratedValue(generator = "generator") @GenericGenerator(name = "generator", strategy = "increment") 
  3. 使用CrudRepository save(Iterable<S> entities)方法保存數據。

  4. 使用: hibernate.jdbc.batch_size配置。

解決方案2的代碼在此處

至於使用多個線程,請記住,從多個線程向數據庫中的同一表寫入可能會產生表級爭用並產生更糟的結果。 您將不得不嘗試計時。 如何使用項目Reactor編寫多線程代碼是一個完全獨立的主題,不在本文討論范圍之內。

HTH。

如果您使用的是SQLServer,則只需創建一個SSiS軟件包即可查找該文件,當文件顯示時,只需抓取並加載它,然后重命名該文件即可。 這樣一來,一次構建就可以執行一百萬次,SSIS可以相當快地加載大量數據。 里克

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM