如何使用Hibernate准备一个大的txt文件来批量插入?

2024-02-16

我试图将超过 200k 行插入 SQL 数据库,每行代表一个卡信息(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 小时,这真的是很久

有没有更好的方法的建议,或者您能为我提供链接以更好地阅读代码吗?

哦顺便说一句,我想使用批量插入来显着缩短时间,但我认为我读取文件的方式是错误的! 提前致谢!!


对于这种操作,JPA 是错误的工具。 虽然使用 JPA 可能可以加快速度,但做到这一点并不困难。 JPA 在加载一些实体、编辑一些属性并让 JPA 确定需要哪些确切更新的工作流程中效果最佳。 为此,JPA 进行了大量缓存,这可能会消耗大量资源。

但在这里,您似乎只想将一些相关数据量注入数据库。 您不需要 JPA 来弄清楚要做什么,这一切都是插入的。 您不需要 JPA 缓存。

我推荐斯普林斯JdbcTemplate or NamedParameterJdbcTemplate。 这可能已经大大加快了速度。

一旦可行,请考虑以下事项:

  • 批量插入,即仅向数据库发送一条语句。看https://mkyong.com/spring/spring-jdbctemplate-batchupdate-example/ https://mkyong.com/spring/spring-jdbctemplate-batchupdate-example/请注意,某些数据库需要特殊的驱动程序参数才能正确处理批量更新。
  • 进行间歇性提交。一般来说,会带来成本效益,因为它迫使数据库实际写入数据。但长事务也可能会导致麻烦,特别是当数据库也在执行其他操作以及发生错误/回滚时。
  • 您需要对批次进行更多控制,请查看春季批次 https://spring.io/projects/spring-batch.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Hibernate准备一个大的txt文件来批量插入? 的相关文章

随机推荐