2

我正在一个基于 Java 的服务器上工作,其中我将有多个线程(每个连接的用户一个线程 + 一些额外的线程)。将涉及一些数据库连接,所以我在想每次服务器对数据库进行SELECT查询时,它都会为此启动一个新线程,以防止当前线程阻塞。我打算为此使用连接池,我想我知道该怎么做。(我已经研究过C3P0)但是,也会涉及很多UPDATE语句,但是直接运行这些语句并不重要,这里有延迟也没关系。而且由于可能有很多UPDATE语句,我正在考虑为所有UPDATE设置一个工作线程陈述。正如我所看到的,这将具有能够重用PreparedStatement-objects的优势

问题: 我怎样才能从其他线程告诉UPDATE -worker 线程运行一些语句?我知道多线程以及如何使用同步块使线程相互“对话”,但是涉及到数据库时,它突然感觉更复杂了。我读过准备好的语句和连接不应该在线程之间共享。

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

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

编辑:我认为自己使用这种方法的一个不好的想法是参数可能是整数、字符串、双精度或其他。如何将它们存储在自定义类中?将它们全部存储为字符串感觉不好。

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

4

1 回答 1

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));

单线程执行器只是一个在队列中等待并按顺序执行提交的任务的工作线程。无需其他显式管理。

于 2012-10-30T19:20:47.440 回答