Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程数据库差异化的正确方法_Java_Database_Multithreading_Diff - Fatal编程技术网

Java 多线程数据库差异化的正确方法

Java 多线程数据库差异化的正确方法,java,database,multithreading,diff,Java,Database,Multithreading,Diff,我的公司从中获得一个Microsoft Access数据库,该数据库需要与我们的生产后端Sybase(12.0.1.3924)不同。虽然我知道现成的数据库差异工具(,),但似乎没有一个适合我的需要——因此,我决定编写一个Java工具来执行这项工作,作为概念证明 目前,该工具正在按设计工作,以下是程序: 获取与配置文件不同的表列表 建立到两个后端的连接 确保配置文件中的表可以与MS Access和Sybase匹配 如果是,则继续进行差异: 对于每个表: 从MS Access获取一行,通过反射实

我的公司从中获得一个Microsoft Access数据库,该数据库需要与我们的生产后端Sybase(12.0.1.3924)不同。虽然我知道现成的数据库差异工具(,),但似乎没有一个适合我的需要——因此,我决定编写一个Java工具来执行这项工作,作为概念证明

目前,该工具正在按设计工作,以下是程序:

  • 获取与配置文件不同的表列表
  • 建立到两个后端的连接
  • 确保配置文件中的表可以与MS Access和Sybase匹配
  • 如果是,则继续进行差异:
    • 对于每个表:
      • 从MS Access获取一行,通过反射实例化对象
      • 迭代行中的每一列,将数据填充到新创建的“Access”POJO中
      • 使用Access POJO,为Sybase构造一个查询
      • 查询Sybase:
      • 如果结果集为空,请在Sybase中插入一条记录
      • 如果结果集不为NULL,则实例化另一个POJO并将Sybase数据填充到其中
      • 比较两个POJO:
      • 如果POJO匹配:不执行任何操作,则转到下一行
      • 如果POJO不匹配:使用Access POJO中的数据对Sybase执行更新
  • 现在如前所述,这项工作目前正在完成,尽管是以一种非常程序化的单线程方式完成的,这就是我的问题:以多线程方式区分两个数据库(碰巧不相关)的正确方法是什么

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


    在这方面有经验的人会提供一些关于如何解决这个问题的高层次见解吗?目前,我在大约2小时内搅拌了超过150万排,约为200 TPS。非常慢。如果您能提供任何指导,我将不胜感激,如有必要,我很乐意提供更多信息。

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

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

    让一个线程从输入(MS Access)数据库的表中读取记录,并将访问POJO放入并发队列(例如)。让多个线程从该队列读取访问POJO,并并行执行更新过程。
    当表中没有更多记录时,让读取线程在队列中放入特殊的“表结束”访问POJO,以便更新线程知道何时停止。此外,当队列太大时(或使用一个线程),读取线程需要暂停。
    对下一个表重复此操作


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

    这很有意义;我熟悉向ThreadPoolExecutor提交期货,这需要ArrayBlockingQueue,但还没有机会实现(或调查)ConcurrentLinkedQueue,因此我将对此进行检查。我非常感谢各位的回应,;似乎它一直都在盯着我看。既然你提到它:
    Queue+Write-thread=FixedThreadPool
    ,你自己就没有必要这么做了。只需让读取线程将Access对象包装在一个runnable中,您所需要的就是一个
    Executors.newFixedThreadPool(int)
    。另请参阅