我正在开发一个基于 Java 的服务器,其中有多个线程(每个连接的用户一个线程+一些额外的线程)。会涉及到一些数据库连接,所以我在想服务器每次创建一个SELECT查询数据库时,它将为此启动一个新线程,以防止当前线程阻塞。我计划为此使用连接池,并且我想我知道该怎么做。 (我已经研究过C3P0 http://www.mchange.com/projects/c3p0/index.html)但是,会有很多UPDATE也涉及到语句,但是直接运行这些并不重要,这里有延迟也可以。而且由于可能有很多UPDATE声明,我正在考虑为所有人提供一个工作线程UPDATE声明。在我看来,这将具有能够重复使用的优点PreparedStatement
-objects
问题:我怎样才能从其他线程中得知UPDATE-工作线程运行一些语句?我了解多线程以及如何使用同步块使线程相互“对话”,但是涉及到数据库,它突然感觉更加复杂。我读过准备好的语句和连接不应在线程之间共享。
我现在关于如何解决这个问题的想法:(感觉不是一个好的解决方案)
Use a LinkedBlockingQueue
自定义类的(或另一种队列),其中包含有关要调用哪种 UPDATE 语句以及要发送哪些参数的信息。然后,工作线程在收到通知时将从该队列中读取数据(当将某些内容添加到队列中时),并且它将运行适当的方法,该方法将使用适当的准备好的语句,设置参数并调用它。
Edit:我认为自己采用这种方法的一个不好的想法是,参数可能是整数、字符串、双精度或其他。如何将它们存储在自定义类中?将它们全部存储为字符串感觉不太好。
我走在正确的轨道上还是有更好的方法来解决这个问题?
不需要显式的阻塞队列。您可以有一个工作线程和一个由一个封装的工作队列ExecutorService http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html。至于值,您可以使用泛型:
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));
单线程执行器只是一个等待队列并按顺序执行提交任务的工作线程。无需其他显式管理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)