Proxool максимальное количество подключений - PullRequest
0 голосов
/ 03 марта 2009

Я использую 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 вместо ожидания доступного соединения? Не навсегда, конечно, но настраиваемое время ожидания было бы здорово.

Не знаю, важно ли это, но я использую Proxool в приложении Tomcat J2EE. Параметры Proxool определены в context.xml, и я использую Поддержка источников данных Proxool .

Ответы [ 3 ]

2 голосов
/ 06 марта 2009

Я задавал вопрос в списке рассылки proxool, и я получил быстрый, но, к сожалению, отрицательный ответ .

В настоящее время нет поддержки настраиваемого (или любого другого) тайм-аута, однако есть планы реализовать эту функцию.

1 голос
/ 04 марта 2009

Я быстро взглянул на исходный код, и это выглядит как стандартное поведение для ConnectionPool.getConnection. документация говорит то же самое.

Существуют и другие библиотеки пулов баз данных (например, Apache DBCP и C3P0), но для их использования вам придется провести некоторый рефакторинг. Альтернатива - самостоятельно обернуть метод getConnection (или изменить источник Proxool) и заставить его работать так, как вы хотите.

0 голосов
/ 27 мая 2009

Вы можете использовать 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;
  }
...