用于SQL更新语句的Java单工作线程

时间:2012-10-30 18:39:18

标签: java multithreading jdbc queue connection-pooling

我正在开发一个基于Java的服务器,我将在其中拥有多个线程(每个连接用户一个线程+一些额外的线程)。将涉及一些数据库连接,所以我想每次服务器对数据库进行 SELECT 查询时,它将为此启动一个新线程,以防止阻塞当前线程。我打算为此使用连接池,我想我知道如何做到这一点。 (我已查看C3P0)但是,也会涉及很多 UPDATE 语句,但这些语句直接运行并不重要,这里有延迟。由于可能有很多 UPDATE 语句,我想为所有 UPDATE 语句设置一个工作线程。在我看来,这将具有能够重用PreparedStatement - 对象

的优势

问题: 我怎样才能从其他线程告诉 UPDATE -worker线程运行一些语句?我知道多线程以及如何使用synchronized块让线程彼此“交谈”,但是随着涉及的数据库,它突然感觉更复杂。我已经读过不应该在线程之间共享准备好的语句和连接。

我现在就如何解决它的想法:(感觉不是一个好的解决方案)

使用自定义类的LinkedBlockingQueue(或其他类型的队列),其中包含要调用哪种UPDATE语句以及要将其发送到哪些参数的信息。然后工作线程将在通知时从该队列中读取(当将某些内容添加到队列时),并且它将运行适当的方法,该方法将使用相应的预准备语句,设置参数并调用它。

编辑:一个不好的想法,我认为自己采用这种方法是params可能是int,String,double或者其他什么。如何将它们存储在自定义类中?将它们全部存储为String感觉不太好。

我是在正确的轨道上还是有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:3)

无需显式阻塞队列。您可以拥有一个由ExecutorService封装的工作线程和工作队列。至于值,您可以使用泛型:

class ThreadTask<T> implements Runnable {
    private T value;

    public ThreadTask(T value) {
        this.value = value;
    }

    public void run() {
        // update based on value
    }
}

...

ExecutorService exec = Executors.newSingleThreadExecutor();
exec.submit(new ThreadTask<String>("asdf"));
exec.submit(new ThreadTask<Integer>(1));

单线程执行程序只是一个工作线程,它等待队列并按顺序执行提交的任务。无需其他明确的管理。