Pregunta

Estoy usando proxool grupo de conexiones java (versión 0.9.1). Todo funciona bien hasta que llego a la máxima cantidad de conexiones. Si se alcanza el número máximo de conexiones, proxool lanza inmediatamente un SQLExcepion :

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

Por supuesto, en lugar de n se muestra el recuento máximo de conexiones.

¿Por qué proxool está lanzando una SQLException inmediatamente en lugar de esperar una conexión disponible? Por supuesto, no para siempre, pero un tiempo de espera configurable sería genial.

No sé si es importante, pero estoy usando proxool en una aplicación Tomcat J2EE. Los parámetros de proxool se definen en context.xml y estoy usando Soporte de Proxool DataSource .

¿Fue útil?

Solución

Estaba haciendo la pregunta en la lista de correo de proxool y obtuve una respuesta rápida, pero desafortunadamente negativa answer .

Ahora no hay soporte para el tiempo de espera configurable (o cualquier otro tipo), sin embargo, hay planes para implementar esta función.

Otros consejos

Eché un vistazo rápido al código fuente y se parece al comportamiento estándar de ConnectionPool.getConnection. La documentación dice lo mismo .

Hay otras bibliotecas de agrupación de bases de datos (como Apache DBCP y C3P0) pero tendrías que hacer un poco de refactorización para usarlas. La alternativa es envolver el método getConnection (o modificar la fuente de proxool) y hacer que funcione de la forma que desee.

Puedes usar Thread.sleep () para manejarlo. Proxool lanza una excepción cuando se alcanza el número máximo de conexión. Una vez que lo detecte, puede esperar un poco llamando a " Thread.sleep () " ;, con suerte después de este período de tiempo, las conexiones estarán disponibles nuevamente.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top