Proxool最大连接数

时间:2009-03-03 10:25:44

标签: java connection-pooling proxool

我正在使用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

3 个答案:

答案 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;
  }