2010-02-19 3 views
11

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

Если я запускаю эту же программу в течение более 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); 

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

ответ

5

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

Спасибо

23

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

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

2

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

Смежные вопросы