Я думаю, что ваш слушатель отключился из-за отсутствия активности. Я подозреваю, что вы открываете соединение, отправляете запрос, а затем оставляете соединение открытым, поскольку код бездействует, ожидая другого клиентского запроса. Это нормально, если ваша база данных настроена так, чтобы соединения были постоянными, но это может использовать весь пул, чего большинство сайтов не хотят.
Можно либо настроить базу данных, чтобы разрешить более длительные сеансы, либо запретить ее вообще отключать, либо изменить свой код для проверки соединения перед попыткой отправить запрос, при необходимости повторно подключиться, а затем продолжить.
Не все адаптеры базы данных позволяют вам выполнять keep-alive / heartbeat или даже спрашивать, живо ли соединение с сервером, поэтому мне пришлось вернуться к переносу простого select 1
из таблицы в обработчик исключений, просто чтобы проверить соединение, прежде чем продолжить.
Другой альтернативой было бы поместить простую подпрограмму keep-alive в отдельный поток, который периодически выполняет простой запрос, такой как select 1
, для поддержания базы данных счастливой. Если эта подпрограмма обнаружит, что соединение разорвано, то оно будет отвечать за установку флага "db_connection_up" на false
или за повторное соединение.
Вы должны определить наилучший способ обработки, основываясь на количестве запросов, которые вы будете обрабатывать. Подключение, выдача крошечного запроса, а затем повторное отключение - это другой вид плохой вещи, поэтому вам нужно найти счастливую среду.
Поговорите со своим администратором базы данных, чтобы узнать, какое время ожидания в базе данных Oracle, и можно ли его изменить или установить постоянное соединение. Если нет, настройте код.
Для получения дополнительной информации найдите в Google «тайм-аут слушателя оракула».