我试图将超过 200k 行插入 SQL 数据库,每行代表一个卡信息(70+ 字符串字段)。在大型 TXT 文件中。
我(新的 Java 开发人员)在这方面面临着相当困难的时期,我的方法是:
- 读取文件
File file = ReadFile.loadCardFile(pathName);
- 将文件转换为流
Stream<String> cardsStream = new BufferedReader(new InputStreamReader(new FileInputStream(file), ("UTF-8"))).lines());
- 获取字符串数组中的每一行(卡片信息用“|”分隔,该字段可能有空格,也可能没有)
cardsStream.forEach(s -> {
String[] card = Arrays.stream(s.split("\\|")).map(String::trim).toArray(String[]::new);
- 插入每一行(卡数据)
numberOfRows = insertCardService.setCard(card, numberOfRows);
- 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(使用前将#替换为@)