【问题标题】:Proxool maximum connection countProxool 最大连接数
【发布时间】:2009-03-03 10:25:44
【问题描述】:
我正在使用proxool java 连接池(版本 0.9.1)。一切正常,直到我达到最大连接数。如果达到最大连接数 proxool 立即抛出SQLExcepion:
java.sql.SQLException: Couldn't get connection because we are at maximum
connection count (n/n) and there are none available
当然会显示最大连接数而不是n。
为什么 proxool 会立即抛出 SQLException 而不是等待可用的连接?当然不是永远,但可配置的超时会很棒。
我不知道它是否重要,但我在 Tomcat J2EE 应用程序中使用 proxool。 proxool 的参数在context.xml 中定义,我使用的是Proxool DataSource Support。
【问题讨论】:
标签:
java
connection-pooling
proxool
【解决方案1】:
我在 proxool 邮件列表上问了这个问题,我得到了一个快速但不幸的是否定的 answer。
现在不支持可配置(或任何类型的)超时,但我们计划实施此功能。
【解决方案2】:
我快速查看了源代码,这看起来像是 ConnectionPool.getConnection 的标准行为。 documentation 也说了同样的话。
还有其他数据库池库(例如 Apache DBCP 和 C3P0),但您必须进行一些重构才能使用它们。另一种方法是自己包装 getConnection 方法(或修改 proxool 源)并使其按您想要的方式工作。
【解决方案3】:
您可以使用 Thread.sleep() 来处理它。
达到最大连接数时,Proxool 会引发异常。一旦你检测到它,你可以通过调用“Thread.sleep()”等待一段时间,希望在这段时间之后,连接将再次可用。
公共连接 getConnection() 抛出 SQLException {
连接 conn = null;
而 (conn ==null){
尝试 {
conn = DriverManager.getConnection("proxool."+connectionPoolAlias);
} 捕捉(SQLException e){
e.printStackTrace();
字符串方法名 =e.getStackTrace()[0].getMethodName();
if (methodName.equalsIgnoreCase("checkSimultaneousBuildThrottle") ||
methodName.equalsIgnoreCase("quickRefuse")){
尝试{
线程.sleep(500);
}catch(InterruptedException 即){}
}别的{
扔 e;
}
}
}
返回连接;
}