我有一个java服务器,可以处理来自多个客户端的登录。服务器为每个tcp/ip套接字侦听器创建一个线程。数据库访问由服务器创建的另一个线程处理。
目前,我连接到服务器的客户端数量非常少(<100),因此我没有真正的性能担忧,但我正在研究如何在未来处理更多的客户端。我担心的是,对于大量的客户端,我的服务器和数据库线程将会因为客户端线程对其方法的不断调用而陷入困境。
具体地说,与数据库相关:此时,每个客户端线程访问其父服务器上的公共数据库线程,并执行数据访问方法。我认为我应该做的是有某种类型的消息队列,客户端线程可以将其数据请求放在其中,数据库线程将在轮到它时执行此操作。如果有数据要从数据访问调用中返回,那么它可以将其放在一个队列中,以供客户端线程拾取。所有这些都不会影响到主服务器代码或任何其他客户端线程。
因此,我认为我想实现一个异步消息队列,客户端线程可以将消息放在该队列中,数据库线程将从中提取消息。这是正确的方法吗?任何关于实现的想法和链接,我都将不胜感激。
发布于 2010-12-02 22:36:48
我不推荐这种方法。
JMS是为这类事情而生的。它将比你从头开始编写的任何实现都要好。我推荐使用内置了JMS的Java应用服务器,或者可以添加到像Tomcat这样的servlet引擎中的ActiveMQ或RabbitMQ。
我强烈建议您在编写自己的代码之前先研究一下这些内容。
发布于 2010-12-02 22:53:57
您正在描述的内容听起来像是ExecutorCompletionService。这本质上是一个异步任务代理,它接受来自一个线程的请求(Runnable或Callable),以Future的形式返回即将到来的结果的“句柄”。然后在thread pool (可以是single thread thread pool)中执行请求,然后通过Future将请求的结果传递回调用线程。
在提交请求和提供响应之间,您的客户端线程将简单地等待Future (带有可选的超时)。
但是,我建议,如果您希望客户端(以及客户端线程)的数量大幅增加,则应该评估一些Java NIO Server框架。这将允许您避免为每个客户端分配一个线程,特别是因为您希望所有这些线程都要花费一些时间等待DB请求。如果是这样的话,我会建议使用MINA或Netty。
干杯。
//Nicholas
发布于 2010-12-02 23:10:30
听起来你想要做的是限制你想要允许的数据库的并发请求的数量。(为了停止它的过载)
我建议你有一个有限大小的连接池。当太多的线程想要使用数据库时,它们将不得不等待,直到连接空闲。要做到这一点,一种简单的方法是使用预先创建了所有连接的BlockingQueue。
private final BlockingQueue<Connection> connections = new ArrayBlockingQueue<Connection>(40); {
// create connections
}
// to perform a query.
Connection conn = connections.get();
try {
// do something
} finally {
connections.add(conn);
}通过这种方式,您可以使线程设计保持不变,并限制对数据库的并发查询数量。通过一些调整,您可以根据需要创建连接,并在无法快速获得数据库连接时提供超时。
https://stackoverflow.com/questions/4336082
复制相似问题