java批量插入方法

标签 java sql spring performance

在基于 Spring 的应用程序服务器上下文中运行时,应用程序有时需要处理对一个大表的高速率数据库插入。当前的实现在底层使用 Spring Data 和 OpenJPA,并连接到 Amazon RDS (Postgresql 9.6) 数据库。当它需要保存某些内容时,它只需调用 Spring 提供的 save 方法。经过性能测试,我们发现它每秒可以写入大约 4000 条记录。

我们构建了一个虚拟应用程序来测试多种方法,结果发现,通过使用 4 个并行连接每批执行 1000 次插入,可以达到每秒大约 13500 条记录的最佳性能。

现在,我们需要更改应用程序的代码,以缓冲其持久对象最多 1000 个(或以其他方式配置),当这些缓冲区已满或在一段超时时间后或服务器关闭时,在这些缓冲区上运行批量插入过程。

有人遇到过这样的问题吗?关于线程问题、同步、数据结构有什么建议吗?

提前致谢, 阿德里安。

最佳答案

听起来你需要写在后面,例如对每个数据更改进行排队,让该队列受可配置的持续时间(也称为“写入延迟”)和最大大小的影响。当数据发生变化时,它会被添加到后写队列中(如果它尚未在队列中),并且只要满足以下条件之一,就会将其写入底层存储:

  • 写入延迟到期
  • 队列超出可配置大小
  • 系统进入关机模式,您希望确保没有数据丢失

如果是这样,那么这个领域就有大量的现有技术。例如Spring的Cache Abstraction允许您添加缓存层,并且它支持符合 JSR-107 的缓存,例如 Ehcache 3.x,它提供 write behind缓存写入器。 Spring 的缓存服务是一个抽象而不是实现,其想法是,当您继续提供存储以及与存储交互的代码时,它将为您照顾缓存逻辑。

关于您问题的具体部分:

Any suggestions about threading issues, synchronization, data-structures?

缓存抽象和选择的缓存实现(例如 Ehcache)将负责线程和同步,并为您提供队列大小、并发级别、批量大小、最大写入延迟等杠杆,以允许您配置其行为。由于它只会包装您现有的代码,因此您无需更改现有的数据结构;只需将现有类型写入缓存,并让缓存在决定需要后写时委托(delegate)给现有存储/存储库实现。

关于java批量插入方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45398580/

相关文章:

java - 从多个属性文件自动加载更新的属性

sql - 渗透测试工具

mysql - 子查询和连接

c# - 连接丢失后自动重新连接到 MySql

Spring Security 4升级后java.lang.NoSuchMethodError org.springframework.web.servlet.tags.form.InputTag.setDisabled

java - quartz 和 Spring : dynamic scheduling

java - 使用 apache poi 按列读取 Excel 工作表

java - 如何重定向到成功页面?

java - AnnotationConfigApplicationContext 注册并刷新另一个配置类

java - 无法在 Spring Boot 应用程序中访问和使用静态资源