Подтвердить что ты не робот

MySQLNonTransientConnectionException в программе JDBC во время выполнения

У меня есть соединение JDBC MySQL в Java. Моя программа отлично работает для простого выполнения запроса.

Если я запускаю ту же программу более 10 часов и выполняю запрос, то получаю следующее исключение MySQL:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
Connection.close() has already been called. Invalid operation in 
this state.
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
  Native Method)
  com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
  No operations allowed after statement closed.
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
  Native Method)

Я не использовал метод close() в любом месте. Я создал соединение с базой данных и открыл его навсегда и всегда выполнял запрос. Нет места, где я явно указывал таймаут для подключения. Я не могу определить проблему.

Вот код, который я использую для подключения к базе данных:

 String driver = PropertyReader.getDriver();
 String url = dbURLPath;
 Class.forName(driver);
 connectToServerDB = DriverManager.getConnection(url);
 connectToServerDB.setAutoCommit(false);

Что вызывает это исключение?

4b9b3361

Ответ 1

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

Спасибо

Ответ 2

MySQL завершает соединение после 8-часового тайм-аута. Вы можете изменить таймаут, установив в MySQL wait_timeout.

Однако, как правило, не очень хорошая идея для приложения поддерживать соединение в течение такого длительного времени. Лучшим подходом является создание пула соединений с использованием API пула, такого как Apache DBCP и извлечение подключений из пула а не напрямую, хотя водитель. Пул соединений также позаботится о восстановлении объединенного соединения, если он по какой-то причине умрет, включая таймауты.

Ответ 3

Я столкнулся с такой же проблемой. Это из-за тайм-аута соединения mysql и, как правило, не является хорошей практикой для расширения тайм-аута в mysql, поскольку он служит для многих других приложений. Это полезно для повторного подключения базы данных к таймаутам (т.е. При возникновении этого исключения) или для использования некоторых библиотек с открытым исходным кодом для объединения пулов, например Apache DBCP в качестве @slava предложил. По умолчанию ORM Framework заботится об этом. Ура!!