用Java开发多线程应用程序

用Java开发多线程应用程序,java,multithreading,Java,Multithreading,这将是我的第一个多线程应用程序,如果它可以这样开发的话。所以我需要一些帮助开始 我目前有下面的JAVA程序,运行得非常好 从源数据库获取数据并将其转换为对象(POJO) 从目标数据库获取数据并将其转换为对象(POJO) 比较源对象和目标对象,如果存在差异,则使用源数据库中的信息更新目标数据库 现在我的需求发生了变化,我需要使用3个不同的目标数据库(TargetDB1、TargetDB2、TargetDB3)。每一个都有不同的连接信息 我的问题是,我们能让它成为一个多线程应用程序吗 线程1将获取源

这将是我的第一个多线程应用程序,如果它可以这样开发的话。所以我需要一些帮助开始

我目前有下面的JAVA程序,运行得非常好

  • 从源数据库获取数据并将其转换为对象(POJO)
  • 从目标数据库获取数据并将其转换为对象(POJO)
  • 比较源对象和目标对象,如果存在差异,则使用源数据库中的信息更新目标数据库
  • 现在我的需求发生了变化,我需要使用3个不同的目标数据库(TargetDB1、TargetDB2、TargetDB3)。每一个都有不同的连接信息

    我的问题是,我们能让它成为一个多线程应用程序吗

    线程1将获取源对象

    线程2将获取TargetDB1对象,与源对象(从线程1获得)进行比较,并在与源对象存在差异时更新TargetDB1

    线程3将获取TargetDB2对象,与源对象(从线程1获得)进行比较,并在与源对象存在差异的情况下更新TargetDB2

    线程4将获取TargetDB2对象,与sourceobject(从线程1获得)进行比较,并在与源对象存在差异的情况下更新TargetDB2


    如果可以将其开发为多线程应用程序,那么该如何进行呢

    我将使用诸如。生产者线程将从源数据库获取对象,然后将其添加到每个工作队列中。然后,连接到目标数据库的每个线程都可以从其工作队列中退出队列,并以自己的速度更新其数据库

    源数据库线程可能类似于:

    // allow only 10 outstanding objects to be in the work queue before it blocks
    queue1 = new LinkedBlockingQueue<SourceObject>(10);
    new Thread(new TargetDatabaseThread("url-to-database1", queue1)).start();
    queue2 = new LinkedBlockingQueue<SourceObject>(10);
    new Thread(new TargetDatabaseThread("url-to-database2", queue2)).start();
    queue3 = new LinkedBlockingQueue<SourceObject>(10);
    new Thread(new TargetDatabaseThread("url-to-database3", queue3)).start();
    while (true) {
        SourceObject sourceObj = getFromSourceDatabase();
        // this might block if you set a capacity on your queue and it was full
        queue1.put(sourceObj);
        queue2.put(sourceObj);
        queue3.put(sourceObj);
    }
    
    此模型的一个问题是,目标数据库线程是否需要以任何方式更新源对象。如果是这种情况,则必须同步对象


    请注意,可以使用容量设置阻塞队列。如果生产者从源数据库读取数据比目标数据库编写者更新数据库更容易,这将非常有用。您不希望队列填满内存,因为目标数据库速度很慢。

    您确定要通过应用程序层完成此操作吗?对于大型卷,使用数据库实用程序会更快。即使只是简单地使用一些SQL语句和.csv也可能更快。我不确定这是否是同步dbs的最佳方式。如果您的DB1是master DB,那么我认为最好为其他DB编写一个升级脚本。我不会使用多线程,但我会考虑一致性。e、 假设DB1、2和3是不同的。一次只比较两个数据库,需要确保所有三个数据库的值都相同。我不太熟悉数据库端脚本,但选择和更新操作需要多个连接来获取数据,然后进行更新。我们打算安排这个程序每隔一段时间运行一次,并更新目标数据库。@Peter,目标数据库都有相同的结构,但一个是INT,一个是Dev DB等等on@Gary..thanks我不需要更新源数据库。谢谢你的代码片段。因为这是我第一次,你能详细说明代码吗。目前,我有大量的类和许多方法来处理整个获取、比较、更新前冲突检查、更新(删除和插入)操作。如何使用它们,以便不同的线程使用相同的程序。本质上,这些线程类是什么样子的,它们是如何在main方法中执行的。您的线程都是同一个类,具有相同的
    ConflictCheck
    等方法。可以称之为
    TargetDatabaseThread
    或类似的东西。他们的构造函数的一个参数是
    BlockingQueue
    ,他们将调用
    take()
    。@Gray..谢谢..我将接受这个答案并开始处理这个问题。如果我被卡住了…我会带着另一个问题回来。
    public class TargetDatabaseThread implements Runnable {
        private final String jdbcUrl;
        private final BlockingQueue queue;
        private volatile boolean shutdown;
        public TargetDatabaseThread(String jdbcUrl, BlockingQueue queue) {
            this.jdbcUrl = jdbcUrl;
            this.queue = queue;
        }
        public void run() {
            // maybe some initialization, make database connection, etc.
            while (!shutdown) {
                // this would block if nothing is in the queue
                SourceObject sourceObj = queue.take();
                SourceObject targetObj =
                    getObjectFromTargetDatabase(sourceObj.getId());
                if (updateTarget(sourceObj, targetObj)) {
                   updateMyTargetObjectInDatabase(targetObj);
                }
            }
        }
    }