Pergunta

Eu estou usando Proxool java pool de conexão (versão 0.9.1). Tudo funciona bem até eu chegar a contagem máxima de conexão. Se a contagem de conexão máxima é atingida Proxool imediatamente lança uma SQLExcepion:

java.sql.SQLException: Couldn't get connection because we are at maximum 
connection count (n/n) and there are none available

É claro que, em vez de n a contagem máxima de conexão é mostrado.

Por que é Proxool lançar uma SQLException imediatamente em vez de esperar por uma conexão disponível? Não para sempre, é claro, mas um tempo limite configurável seria ótimo.

Eu não sei se é importante, mas eu estou usando Proxool em uma aplicação Tomcat J2EE. Parâmetros de Proxool são definidos no context.xml e eu estou usando Proxool DataSource Suporte .

Foi útil?

Solução

Eu estava fazendo a pergunta na lista Proxool de discussão e eu tenho uma rápida, mas infelizmente negativo resposta .

Agora não há suporte para configurável (ou qualquer tipo de) tempo limite, no entanto, existem planos para implementar este recurso.

Outras dicas

Eu levei um rápido olhar para o código-fonte e esta parece ser o comportamento padrão para ConnectionPool.getConnection. A documentação diz a mesma coisa .

Existem outras bibliotecas agrupamento de banco de dados (tais como Apache DBCP e C3P0), mas você tem que fazer alguma refatoração para usá-los. A alternativa é para embrulhar o método getConnection si mesmo (ou modificar a fonte Proxool) e fazê-lo funcionar da maneira que quiser.

Você pode usar Thread.sleep () para lidar com isso. Proxool inicia uma excepção, quando o número de ligação máxima é atingida. Uma vez que você detectá-lo, você pode esperar por um tempo chamando "Thread.sleep ()", espero que após este período de tempo, as conexões estará disponível novamente.

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;
  }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top