我公司从Cerner Multum获取Microsoft Access数据库,需要与我们的生产后端(Sybase(12.0.1.3924))进行区分。虽然我知道现成的数据库差异工具(http://www.diffkit.org/,http://www.liquibase.org/),但似乎没有一个适合我的需要 - 因此,我决定编写一个Java工具来执行作为概念证明的工作。
目前,该工具目前按设计工作,这是程序:
现在如上所述,目前这已经完成了工作,虽然采用非常程序化的,单线程方式,其中存在我的问题:什么是正确的方法来区分两个数据库(恰好是无关的)以多线程方式?
我有一些多线程的经验,但我不确定正确的方法,因为我从未排队插入/更新。也就是说,我并不完全确定排队是正确的方法 - 批量更新/插入怎么样?
在这方面有一定经验的人是否会就如何解决这个问题提供一些高级别的见解?就目前而言,我在大约2小时内搅拌了超过1.5米的行,大约是200 TPS。非常慢。我们非常感谢任何指导,如果有必要,我很乐意提供更多信息。
答案 0 :(得分:1)
根据我的经验,拥有能够正确完成此类工作的工具非常有价值。它可能很慢,但如果它足够快,更改它以使其更快是不值得冒错误结果的风险。
话虽如此,每个表的当前差异过程非常适合多线程。与可能需要更新的(Sybase)数据库通信时,该过程可能会在网络延迟中丢失大部分时间。有几个线程同时执行此操作将有助于吞吐量。
让一个线程从输入(MS Access)数据库中读取表中的记录,并将Access Pojos放入并发队列(例如ConcurrentLinkedQueue)。让许多线程从该队列中读取Access Pojos并并行执行更新过程。
当表中没有更多记录时,让读取线程将特殊的“结束表”访问Pojos放入队列中,以便更新线程知道何时停止。此外,当队列变得太大(或使用ArrayBlockingQueue)时,读取线程需要暂停。
重复下一个表格。
这里的想法是移动当前源代码而不会进行太多改动(这可以最大限度地降低破坏东西的风险):读取线程获取一个Runnable对象,其中包含当前代码,用于从MS Access数据库读取并创建Access Pojo(并在循环中执行此操作),写入线程获取一个Runnable,其中包含用于比较和更新Sybase数据库的当前代码。