我正在运行Web服务器。每个用户请求都会更新/查找数据库。同时db连接的最大数量应该是< N.第N + 1个并发请求应退出并执行其他逻辑,而不是连接到db。我能想到的做法是使用原子整数,在连接到数据库时,将按每个请求递增/递减。java中的同步帮助
我的问题是,除了原子整数以外,java中是否还有其他可用的同步协助?我不认为我可以使用CountDownLatch或循环障碍。
我正在运行Web服务器。每个用户请求都会更新/查找数据库。同时db连接的最大数量应该是< N.第N + 1个并发请求应退出并执行其他逻辑,而不是连接到db。我能想到的做法是使用原子整数,在连接到数据库时,将按每个请求递增/递减。java中的同步帮助
我的问题是,除了原子整数以外,java中是否还有其他可用的同步协助?我不认为我可以使用CountDownLatch或循环障碍。
Semaphore
是最合适的同步原语这种情况:
private Semaphore s = new Semaphore(N);
public void doRequest() {
if (s.tryAquire()) {
try {
...
} finally {
s.release();
}
} else {
// other logic
}
}
您可以尝试连接的ArrayBlockingQueue。初始化队列N.
但我会敦促使用现有的解决方案,如proxool。
@shk as suraj建议,您也可以使用LinkedBlockingQueue,它具有较高的吞吐量。 – 2011-03-07 10:28:29
感谢您的回答。 – ihavprobs 2011-03-07 10:30:36
或者您可以使用连接池,如Apache Commons DBCP会为您处理的连接和可以等待一个连接时,有ISN”一个或将抛出你可以处理的异常。
是的,使用两个数据库。对于一个数据库,将使用dbcp,对于另一个数据库(远程机器),将为每个请求创建并关闭连接。 – ihavprobs 2011-03-07 10:32:32
添加到苏拉杰的答案,我认为你的问题更多的是producer consumer
,我更喜欢LinkedBlockingQueue
更多的吞吐量。
哪个Web服务器? – adarshr 2011-03-07 10:11:56