Прерывистое сообщение об ошибке при соединении JSP <-> Mysql - PullRequest
1 голос
/ 19 мая 2011

У меня есть несколько страниц 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 не использует какой-либо механизм поддержки активности, чтобы избежать этой проблемы.Я думаю, это будет частью дизайна каждого пула соединений.

1 Ответ

1 голос
/ 14 ноября 2011

Мне удалось решить проблему, добавив следующие свойства в context.xml:

testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"

Эти настройки приводят к проверке соединения при его извлечении из пула.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...