JDBC исключение при первом доступе - PullRequest
1 голос
/ 10 июля 2011

У меня есть приложение Java под Tomcat, подключающееся к базам данных Postgre и MySQL.Каждый раз, когда я обращаюсь к базе данных из Java (через некоторое время), она всегда дает сбой.Я проверил журнал Tomcat и обнаружил следующее:

Последний пакет, успешно отправленный на сервер, был 85,313,128 миллисекунд назад.на
длиннее, чем сконфигурированное сервером значение wait_timeout.Чтобы избежать этой проблемы, следует рассмотреть возможность истечения срока действия и / или проверки допустимости подключения перед использованием в приложении, увеличения значений, настроенных сервером для тайм-аутов клиента, или использования свойства подключения Connector / J 'autoReconnect = true'.

Я проверил этот вопрос , но не совсем понимаю решение (или применимо ли оно к моему делу) или почему это происходит.

Полагаю, проблема в том, чтоБаза данных Postgre / MySQL слишком долго простаивала, но когда я получаю доступ к базе данных с помощью Java, я открываю соединение и всегда закрываю его по окончании, поэтому не понимаю, почему соединение должно оставаться открытым так долго.

У кого-нибудь есть идеи?

ОБНОВЛЕНИЕ:

Я не использую C3PO ... Я подключаюсь с:

 Datasource d = context.lookup("....");
 Connection c = d.getConnection();

И отключаюсь с:

c.close();

А контекст для MySQL выглядит так:

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="200" maxIdle="15" maxWait="-1" name="jdbc/project" password="...." type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/project" username="..."/>
<ResourceLink global="jdbc/project" name="jdbc/project" type="javax.sql.DataSource"/>

1 Ответ

2 голосов
/ 10 июля 2011

Я предполагаю, что вы используете пул соединений для получения соединений с MySQL.Принцип пула соединений заключается в том, что он открывает множество соединений и выдает одно из них по запросу.Когда вы закрываете соединение, физическое соединение не закрывается, но соединение возвращается в пул для использования другим запросом.Это позволяет значительно повысить производительность, поскольку вы избегаете бесконечного открытия и закрытия соединений: открытие соединения обходится дорого.

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

  • настроить свой пул соединений для проверки соединения перед его передачей
  • или увеличить wait_timeout на сервере MySQL, как указано в сообщении об ошибке
  • или используйте свойство подключения autoReconnect = true, как указано в сообщении об ошибке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...