2011-03-07 75 views
1

我正在运行Web服务器。每个用户请求都会更新/查找数据库。同时db连接的最大数量应该是< N.第N + 1个并发请求应退出并执行其他逻辑,而不是连接到db。我能想到的做法是使用原子整数,在连接到数据库时,将按每个请求递增/递减。java中的同步帮助

我的问题是,除了原子整数以外,java中是否还有其他可用的同步协助?我不认为我可以使用CountDownLatch或循环障碍。

+0

哪个Web服务器? – adarshr 2011-03-07 10:11:56

回答

4

Semaphore是最合适的同步原语这种情况:

private Semaphore s = new Semaphore(N); 

public void doRequest() { 
    if (s.tryAquire()) { 
     try { 
      ... 
     } finally { 
      s.release(); 
     } 
    } else { 
     // other logic 
    } 
} 
3

您可以尝试连接的ArrayBlockingQueue。初始化队列N.

  1. 初始化队列与N-
  2. 填充所述N个的连接。
  3. 每当有人需要的连接,首先做q.poll()
  4. 如果q.poll()返回null,则母鹿你的“执行其他逻辑”
  5. 使用放回池中连接后。

但我会敦促使用现有的解决方案,如proxool

+0

@shk as suraj建议,您也可以使用LinkedBlockingQueue,它具有较高的吞吐量。 – 2011-03-07 10:28:29

+0

感谢您的回答。 – ihavprobs 2011-03-07 10:30:36

1

或者您可以使用连接池,如Apache Commons DBCP会为您处理的连接和可以等待一个连接时,有ISN”一个或将抛出你可以处理的异常。

+0

是的,使用两个数据库。对于一个数据库,将使用dbcp,对于另一个数据库(远程机器),将为每个请求创建并关闭连接。 – ihavprobs 2011-03-07 10:32:32

0

添加到苏拉杰的答案,我认为你的问题更多的是producer consumer,我更喜欢LinkedBlockingQueue更多的吞吐量。