2009-12-08 2 views
7

Я установил tomcat для использования пула соединений еще после таймаута mysql на соединениях, соединения, ранее открытые в пуле, не открываются. Вот как выглядит мой файл context.xml:Пул соединений JDBC не открывается. Соединения в tomcat

<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource" 
      maxActive="5" maxIdle="3" maxWait="10000" 
      username="uname" password="password" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/> 

Как вы можете видеть, я включил autoReconnect как истинный, но это не так. Я проверил процесс в базе данных через 8 часов, на что установлен тайм-аут. Если кто-то может помочь, пожалуйста, помогите мне, поскольку это было проблемой в течение нескольких месяцев, но только что появилось как неотложное из-за того, что мое программное обеспечение скоро появится.
Заранее спасибо Дин Честер

ответ

6

Попробуйте добавить атрибут запроса проверки. Это должно привести к автоматическому закрытию и повторному открытию соединения после таймаута следующим образом:

validationQuery="SELECT 1" 
+0

Я получил это решение на другом форуме и уже сделал это. – Dean

+0

validationQuery недостаточно. Пожалуйста, прочитайте: http://leakfromjavaheap.blogspot.com/2013/11/robust-db-connection-pool-configuration.html –

+0

'testWhileIdle' и' test-on-loan' будут использовать validationQuery –

1

Поскольку это срочно и для производства я предлагаю вам иметь вид на приличном пул соединений, таких как c3p0. Он более надежный и надежный и может обрабатывать таймауты лучше.

5

Во-первых, избавиться от имущества autoReconnect. Вам не нужно это с пулом соединений и может вызвать проблемы.

Во-вторых, убедитесь, что вы близкие все ресурсы (Connection, Statement и ResultSet) в вашем коде JDBC в finally блоке.

Я не уверен, что это применимо в вашем случае, но распространенное заблуждение среди начинающих состоит в том, что они, похоже, считают, что вам не нужно закрывать эти ресурсы в случае объединения соединений. Это неверно. Обобщенное соединение является оболочкой (декоратор) вокруг соединения, которое имеет слегка измененную close() метода, который примерно похож

public void close() throws SQLException { 
    if (this.connection is still active) { 
     do not close this.connection, but just return it to pool for reuse; 
    } else { 
     actually invoke this.connection.close(); 
    } 
} 

С другими словами, закрывая их освобождает до объединенной связи с тем, что его можно положить обратно в пуле для повторного использования в будущем. Если вы приобретете соединения, не закрывая их, у пула рано или поздно закончится соединение.

0

С вашей конфигурацией, он не должен создавать другое соединение, если он не работает. Попробуйте добавить

minIdle="3" 

С помощью этой настройки DBCP будет поддерживать 3 соединения все время.

Мы видим точно такое же поведение с одним из легко используемых серверов. Из-за установленного по умолчанию времени ожидания 8 часов мы не видим никаких соединений, когда приходим утром. Это то, чего мы ожидали. Однако иногда мы видим устаревшее соединение, и первый запрос терпит неудачу. Чтобы обойти эту проблему, вам необходимо добавить следующие атрибуты:

testWhileIdle="true", 
timeBetweenEvictionRunsMillis="60000"