Пул соединений JDBC не открывает повторно соединения в Tomcat
-
18-09-2019 - |
Вопрос
Я настроил 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"