У меня есть несколько страниц jsp, которые подключаются к базе данных mysql, и я периодически получаю следующее сообщение об ошибке:
"Последний пакет, успешно полученный от сервера, был 36 727 995 миллисекунд назад. Последний пакет успешно отправлен наСервер был 36 733 072 миллисекунд назад. Это больше, чем сконфигурированное сервером значение wait_timeout. Вы должны рассмотреть вопрос об истечении срока действия и / или проверке допустимости соединения перед использованием в приложении, увеличении значений, настроенных сервером для тайм-аутов клиента, или использовании Connector / Jсвойство соединения 'autoReconnect = true', чтобы избежать этой проблемы "
Шаблон возникновения довольно случайный, но чаще всего он возникает после того, как на сайте не было большой активности, как, например, в первой половине дня.
Я нашел этот поток в stackoverflow, в котором упоминается та же ошибка: Tomcat6 не может подключиться к MySql (драйвер не получил пакетов от сервера)
иокончательный результатЯ хотел добавить эту строку:
permission java.net.SocketPermission "127.0.0.1:3306", "connect";
в
$TOMCAT-CONFIG/policy.d/04webapps.policy
Я запускаю tomcat 7 на centOS 5.5 и не вижу ни директории policy.d, ни 04webapps.файл политики где угодно.Нужно ли создавать их вручную или есть другой способ решения этой проблемы?
Обновление: Вот пример того, как я запрашиваю базу данных в одном из моих файлов jsp:
DBFunctions dbf = null;
boolean bException = false;
ArrayList<String[]> arrayListRows1 = new ArrayList<String[]>();
try
{
dbf = new DBFunctions();
dbf.db_run_query(query2);
while (dbf.rs.next()) {
String [] tmp = new String[6];
tmp[0] = dbf.rs.getString("fact_data.entity_id");
tmp[1] = dbf.rs.getString("date_begin");
tmp[2] = dbf.rs.getString("value");
tmp[3] = dbf.rs.getString("ticker");
tmp[4] = dbf.rs.getString("full_name");
tmp[5] = dbf.rs.getString("name");
arrayListRows1.add(tmp);
}
}
catch (SQLException sqle)
{
out.println(PopulateSpreadsheet.createGoogleError(strReqId,"sql_exception",sqle.getMessage(),"PF ERROR CODE 2eh2-1"));
bException = true;
}
finally
{
if (dbf !=null) dbf.closeConnection();
if (bException == true)
return;
}
DBFunctions.java находится в каталоге src / веб-приложения, поэтому технически это не страница jsp, которая напрямую запрашивает базу данных.
Я вернусь и еще раз проверю, но япопытался закодировать все мои запросы к базе данных таким же образом с закрытием соединения сразу после завершения с ResultSet.
Любые рекомендации о том, как лучше провести инвентаризацию в пуле соединений, чтобы периодически проверять состояние соединений?
Обновление: у меня все еще есть проблемы с этой ошибкой.Я ценю предложения по переносу большей части моей логики программирования со страниц JSP в сервлет / библиотеку, но я не думаю, что это решит эту конкретную проблему.
Другие люди сообщали, что видели эту проблему, и это связано с тем, что mysql тайм-аут соединений в пуле соединений tomcat jdbc.Мне странно, что пул соединений Tomcat не использует какой-либо механизм поддержки активности, чтобы избежать этой проблемы.Я думаю, это будет частью дизайна каждого пула соединений.