gpt4 book ai didi

java - 如何在并发批处理中绕过 JDBC 语句缓存?

转载 作者:行者123 更新时间:2023-11-30 05:15:53 24 4
gpt4 key购买 nike

我正在开发一个服务器,该服务器应该从数百个业务部门接收夜间报告。报告当前是加密的 csv 文件。每天的报告总数应达到 500 000 到 1 000 000 条记录,这些记录将保存到数据库中以供以后使用。

我为每次传输创建了一组PreparedStatements。这些语句用于在执行和提交之前批处理 50 条记录。每条记录最多可能导致 20 次数据库插入。当传输被排队并逐一处理时,一切都很好。

当我尝试同时执行此操作时,我注意到不同的线程获得了完全相同的PreparedStatements 实例。这导致了以下问题

  1. 多个线程向同一批处理添加语句
  2. 当任何线程认为是时候执行批处理时,就会执行批处理
  3. 当数据库不满足其约束时调用 Commit,因为某些线程没有时间使用某些语句

问题是:是否有办法强制创建准备好的语句,而不是重用语句缓存中的现有语句?

如果没有,还有比

更好的方法来处理这种情况吗?
  • 为没有语句/连接池的批处理创建单独的数据源
  • 从数据库中删除约束;插入顺序不再重要
  • 强制顺序处理
<小时/>

编辑:尝试澄清问题

设线程 T1 和 T2。准备好语句 S1 和 S2。设批处理 B1 和 B2。

每次使用 S1 时,都会将其添加到 B1 中。每次使用 S2 时,都会将其添加到 B2 中。提交时,根据外键约束,S1 必须在 S2 之前提交。

出现问题时

  • T1 愉快地处理传输
  • T2 无辜地处理传输
  • T1 使用语句 S1 将 s1a 添加到包含 s1a 的批处理 B1
  • T1 使用语句 S2 将 s2a 添加到包含 s2a 的批处理 B2
  • T1 决定是时候提交
  • T1 提交包含 s1a 的批处理 B1
  • T2 使用 S1 将 s1b 添加到包含 s1b 的批处理 B1
  • T2 使用 S2 将 s2b 添加到包含 s2a、s2b 的批处理 B2
  • T1 提交包含 s2a、s2b 的批处理 B1
  • 数据库说“不,不”,因为 s2b 在 s1b 之前提交,这在外键中是被禁止的。

可以通过手动同步以及在答案中指出来避免这种情况,但我仍然必须单独跟踪每个批处理的大小,而不是对每个线程应用本地逻辑。

最佳答案

您是否尝试在单个连接实例中使用多个语句? IMO,建议您描述的行为使用连接池。另一种方法是手动同步。

关于java - 如何在并发批处理中绕过 JDBC 语句缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1326754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com