У меня есть Подключение mysql JDBC в 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);
Что вызывает то исключение?
MySQL завершает соединение по истечении 8 часов ожидания. Вы можете изменить время ожидания, установив переменную wait_timeout в MySQL.
Тем не менее, как правило, для приложения не рекомендуется поддерживать соединение в течение такого длительного времени. Лучшим подходом является создание пула соединений с использованием API объединения, такого как Apache DBCP , и получение соединений из пула, а не напрямую через драйвер. Пул соединений также позаботится о восстановлении объединенного соединения, если оно по какой-то причине умирает, включая тайм-ауты.