Java的单工作线程SQL更新语句(Java single worker thread for SQ

2019-08-02 03:15发布

我正在一个基于Java的服务器中,我将有多个线程(一个线程为每个连接的用户+一些额外的)上。 会有一些涉及数据库的连接,所以我在想,每次服务器做一个SELECT查询数据库,将开始为这个新的线程,以防止当前线程阻塞。 我打算使用这个连接池,我想我知道如何做到这一点。 (我看着C3P0 ),但会有很多也参与UPDATE语句,但它并不重要,这些都是直接奔,这是确定在这里的延迟。 而且,由于可能会有很多UPDATE语句的,我想有所有UPDATE语句的单一工作线程。 在我看来,这将是能够优势重新使用PreparedStatement -objects

问题:我如何从其他线程,告诉UPDATE -worker线程来运行一些语句? 我知道的多线程,以及如何使线程“交谈”相互使用synchronized块,但与数据库有关它突然感觉更复杂。 我已阅读,准备语句和连接不应该在线程之间共享。

这个想法我现在所拥有的关于如何解决这个问题:(不觉得自己是一个很好的解决方案)

使用LinkedBlockingQueue的定制类(或另一种队列)与信息有关哪种UPDATE语句来调用和参数发送。 然后,工作线程将当它被通知(这当事情被添加到队列这将是)从队列中读出,且它将运行,这将使用相应的准备语句,把params,并把它适当的方法。

编辑:一个坏觉得我把自己这种方法是,PARAMS可能是整数,字符串,双,或什么的。 如何将它们存储在自定义类? 感觉并不好,他们都存储为字符串。

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

Answer 1:

没有必要明确地阻塞队列。 你可以有一个工作线程,并通过封装工作队列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));

单线程执行是一个简单的工作线程等待队列中,为了执行提交的任务。 无需其他明确的管理。



文章来源: Java single worker thread for SQL update statements