Proxool contagem máxima de conexão
-
03-07-2019 - |
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 .
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; }