簡體   English   中英

如何准備一個大的 txt 文件以使用 Hibernate 批量插入?

[英]How to prepare a large txt File to batch insert using Hibernate?

我試圖向 sql 數據庫插入超過 20 萬行,每一行代表一個卡片信息(70+ 字符串字段)。 在大型 TXT 文件中。 我(新 Java 開發人員)在這方面面臨着相當困難的時期,我的方法是:

  1. 讀取文件
    File file = ReadFile.loadCardFile(pathName);
  1. 將文件轉換為流
Stream<String> cardsStream = new BufferedReader(new InputStreamReader(new FileInputStream(file), ("UTF-8"))).lines());
  1. 獲取字符串數組中的每一行(卡片信息由“|”分割,該字段可能或可能不隔開)
cardsStream.forEach(s -> {
                    String[] card = Arrays.stream(s.split("\\|")).map(String::trim).toArray(String[]::new);
  1. 插入每一行(卡片數據)
numberOfRows = insertCardService.setCard(card, numberOfRows);
  1. setCard 是將行數據映射到它的列然后我保存每張卡片
CardService.save(Card);

使用這種方法最多需要 2 小時,這真的很

有沒有更好的方法的建議,或者你能給我提供鏈接以更好地閱讀代碼嗎?

哦順便說一句,我想使用批量插入來顯着縮短時間,但我認為我讀取文件的方式是錯誤的! 提前致謝!!

默認情況下,hibernate 不會批量保存數據。 您可以通過設置以下參數來啟用它。

spring.jpa.properties.hibernate.jdbc.batch_size=50
spring.jpa.properties.hibernate.order_inserts=true

JPA 是這種操作的錯誤工具。 雖然可能可以使用 JPA 使其快速完成,但這樣做並不困難。 JPA 在加載一些實體、編輯一些屬性並讓 JPA 確定哪些確切更新是必要的工作流中效果最佳。 為此,JPA 進行了大量緩存,這可能會消耗大量資源。

但在這里,您似乎只想將一些相關的數據量泵入數據庫。 你不需要 JPA 來弄清楚要做什么,這都是插入。 您不需要 JPA 緩存。

我推薦 Springs JdbcTemplateNamedParameterJdbcTemplate 這可能已經大大加快了速度。

一旦成功,請考慮以下事項:

  • 批量插入,即只向數據庫發送一條語句。 請參閱https://mkyong.com/spring/spring-jdbctemplate-batchupdate-example/請注意,某些數據庫需要特殊的驅動程序參數才能正確處理批量更新。
  • 進行間歇性提交。 總的來說就是性價比,因為它迫使數據庫實際寫入數據。 但是長時間的事務也可能會導致麻煩,尤其是當數據庫也在做其他事情時以及在錯誤/回滾的情況下。
  • 您需要對批次進行更多控制,請查看Spring Batch

暫無
暫無

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

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