Пул соединений JDBC не открывает повторно соединения в Tomcat

StackOverflow https://stackoverflow.com/questions/1870288

Вопрос

Я настроил Tomcat на использование пула соединений, но после истечения времени ожидания MySQL для подключений соединения, ранее открытые в пуле, не открываются.Вот что мой файл context.xml похоже:

<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"/>

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

Это было полезно?

Решение

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

validationQuery="SELECT 1"

Другие советы

Во-первых, избавьтесь от 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();
    }
}

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

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

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

  minIdle="3"

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

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

testWhileIdle="true",
timeBetweenEvictionRunsMillis="60000"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top