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

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

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

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

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

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

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

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

 class ThreadTask 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("asdf")); exec.submit(new ThreadTask(1)); 

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