我正在使用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。
答案 0 :(得分:2)
我在proxool邮件列表上问了这个问题,我得到了一个快速但不幸的消极answer。
现在不支持可配置(或任何类型)的超时,但是有计划实现此功能。
答案 1 :(得分:1)
我快速浏览了一下源代码,这看起来像是ConnectionPool.getConnection的标准行为。 documentation说同样的话。
还有其他数据库池库(例如Apache DBCP和C3P0),但您必须进行一些重构才能使用它们。另一种方法是自己包装getConnection方法(或修改proxool源)并使其按照您想要的方式工作。
答案 2 :(得分:0)
您可以使用Thread.sleep()来处理它。 达到最大连接数时,Proxool会抛出异常。一旦你检测到它,你可以通过调用“Thread.sleep()”等待一段时间,希望在这段时间后,连接将再次可用。
public Connection getConnection() throws SQLException { Connection conn = null; while (conn ==null){ try { conn = DriverManager.getConnection("proxool."+connectionPoolAlias); } catch (SQLException e) { e.printStackTrace(); String methodName =e.getStackTrace()[0].getMethodName(); if (methodName.equalsIgnoreCase("checkSimultaneousBuildThrottle") || methodName.equalsIgnoreCase("quickRefuse")){ try{ Thread.sleep(500); }catch( InterruptedException ie){} }else{ throw e; } } } return conn; }