【问题标题】:What's the proper approach to multi-threaded database diffing?多线程数据库差异的正确方法是什么?
【发布时间】:2014-06-27 16:36:59
【问题描述】:

我的公司从Cerner Multum 获得了一个Microsoft Access 数据库,该数据库需要与我们的生产后端Sybase (12.0.1.3924) 进行区分。虽然我知道现成的数据库差异工具(http://www.diffkit.org/http://www.liquibase.org/),但似乎没有一个适合我的需要——因此,我决定编写一个 Java 工具来执行这项工作作为证明-概念。

就目前而言,该工具目前正在按设计工作,程序如下:

  1. 从配置文件中获取要区分的表列表
  2. 建立与两个后端的连接
  3. 确保配置文件中的表可以与 MS Access 和 Sybase 匹配
  4. 如果是这样,请继续比较:
    • 对于每个表:
      • 从 MS Access 获取一行,通过反射实例化一个对象
      • 遍历行中的每一列,将数据填充到新创建的“Access” POJO中
      • 使用 Access POJO,为 Sybase 构造查询
      • 查询 Sybase:
      • 如果结果集为 NULL,则在 Sybase 中插入一条记录
      • 如果结果集不为 NULL,则实例化另一个 POJO 并将 Sybase 数据填充到其中。
      • 比较两个 POJO:
      • 如果 POJO 匹配:什么都不做,继续下一行。
      • 如果 POJO 不匹配:使用 Access POJO 中的数据对 Sybase 执行更新

现在如上所述,这目前正在完成工作,尽管是以非常程序化的 单线程 方式,这就是我的问题:区分两者的正确方法是什么数据库(碰巧不相关)以多线程方式

我在多线程方面有一些经验,但我不确定正确的方法,因为我从未将插入/更新排队。也就是说,我不完全确定排队是正确的方法——批量更新/插入呢?

在这方面有一些经验的人能否就如何解决这个问题提供一些高层次的见解?就目前而言,我在大约 2 小时内处理了超过 150 万行,大约是 200 TPS。非常慢。任何指导将不胜感激,如有必要,我很乐意提供更多信息。

【问题讨论】:

标签: java database multithreading diff


【解决方案1】:

根据我的经验,拥有能够正确完成此类工作的工具非常有价值。它可能很慢,但如果它足够快,那么更改它以使其更快是不值得冒错误结果的风险。

话虽如此,每个表的当前差异过程非常适合多线程。在与可能需要更新的 (Sybase) 数据库通信时,该过程可能大部分时间都在网络延迟上丢失。让几个线程并行执行此操作将有助于提高吞吐量。

让一个线程从输入(MS Access)数据库的表中读取记录,并将 Access Pojos 放入并发队列(例如ConcurrentLinkedQueue)。让多个线程从这个队列中读取 Access Pojo,并并行执行更新过程。
当表中没有更多记录时,让读取线程将特殊的“表尾”Access Pojos 放入队列中,以便更新线程知道何时停止。此外,当队列变得太大时,读取线程需要暂停(或使用ArrayBlockingQueue)。
下一张桌子重复。

这里的想法是移动当前源代码而不会进行太多更改(这将破坏东西的风险降到最低):读取线程获取带有当前代码的 Runnable 对象,用于从 MS Access 数据库中读取并创建 Access Pojo(并在循环中执行此操作),写入线程获得一个带有当前代码的 Runnable,用于比较和更新 Sybase 数据库。

【讨论】:

  • 这很有意义;我熟悉向 ThreadPoolExecutor 提交期货,这需要一个 ArrayBlockingQueue,但还没有机会实现(或调查)ConcurrentLinkedQueue,所以我会检查一下。我非常感谢您的回复;似乎它一直盯着我的脸。
  • 既然你提到了它:Queue + Write thread = FixedThreadPool,你自己就不需要这样做了。只需让读取线程将访问对象包装在可运行对象中,您所需要的只是Executors.newFixedThreadPool(int)
猜你喜欢
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
相关资源
最近更新 更多