2014-10-31 2 views
1

У меня есть проект Django, который использует базу данных Oracle 11. Я регулярно получаю это исключение из Джанго:Django & Oracle DB теряют контакт

OperationalError: ORA-03135: connection lost contact 
Process ID: 0 
Session ID: 0 Serial number: 0 

Там нет особого вида Джанго, который вызывает исключение. Он может исходить из любого представления.

Из трассировки стека, похоже, что это исключение выбрасывается из промежуточного программного обеспечения. Нет никакого промежуточного программного обеспечения третьей стороны, которое могло бы вызвать проблему, это все стандартное встроенное Django.

Где было бы лучше всего искать отладку этой проблемы? Я нашел очень мало в Интернете относительно этой ошибки. Будет ли какая-либо из параметров в модуле Django.settings (например, config DATABASES) играть роль?

+0

Вы видите эту тему: https://community.oracle.com/thread/2230671?tstart=0? Если причина не в тайм-ауте, вы видели историю SQL-запросов закрытых сессий? Есть некоторые ошибки в oracle, когда «неправильный» SQL-запрос приводит к прерыванию сеанса (разные SQL в версиях оракула). Например: выберите 1 из двойного объединения выберите 1 из двойного порядка по dbms_random.value. – Dmitry

+0

Я предполагаю, что SID, Serial и Process меняются каждый раз при возврате ошибки. Сколько времени потребуется, чтобы проблема появилась после перезапуска промежуточного программного обеспечения? – Gui

ответ

2

Есть много различных причин возникновения этой ошибки:

конфигурации вашего пула соединений

Проверьте, если подключение к бассейну имеет такие параметры, как таймаута или жизни. У меня возникли проблемы с этим параметром, вызывающим ошибку ORA-03135 после одной минуты бездействия объединенного сеанса. Решение в моем случае состояло в использовании не объединенных соединений, но это небезопасно для большинства приложений. В вашем случае установка более высокого тайм-аута может сделать трюк.

Попробуйте активировать самый высокий уровень отладки на DJango и/или промежуточное программное обеспечение, чтобы узнать, записывает ли он сообщения о сеансах, истекающих в пуле. Перезапустите промежуточное программное обеспечение и время, необходимое для начала сбоя. Если это короткий период времени (например, 60 секунд), вы можете изменить таймаут и убедиться, что в пуле достаточно сеансов для загрузки.

сеть Ошибка/Firewall

Всех видов сетевых проблем, такие как отброшенные пакеты или проблемы сетевой карты может вызвать соединение понижаться.

Чтобы отладить этот, подключитесь к базе данных с помощью Sqlplus и выполните любую данную команду. После этого оставьте сессию неактивной для 10,20,30,60 и 120 минут (по одной попытке за раз). Это даст вам знать, если проблема возникает только через пул соединений или с SQLPLUS. Если последнее верно, то это может быть сетевая проблема или конфигурация (такой тайм-аут брандмауэра), который убивает сеанс из-за неактивности. Это особенно верно, если сеанс всегда умирает после того же интервала (например, через два часа). Попробуйте тот же эксперимент на других машинах, чтобы узнать, все еще происходит тайм-аут. Если это происходит только с определенных хостов, это может быть проблемой с коммутатором, к которому подключен хост. Возможно, вам потребуются ваши сетевые инженеры.

Конфигурация OS Keepalive может помочь в этом случае. Ниже приведена ссылка для Windows. http://blogs.technet.com/b/nettracer/archive/2010/06/03/things-that-you-may-want-to-know-about-tcp-keepalives.aspx

Еще один способ отладки таких ошибок - это трассировка TNS на клиенте и/или сервере. Это делается путем настройки параметров как TRACE_LEVEL_CLIENT и TRACE_LEVEL_SERVER соответственно в файлах клиента и сервера sqlnet.ora. Для этого требуются другие параметры. Проверьте документацию Oracle по этому вопросу.

Oracle стороне сервера разъединение

База данных может отключить сеанс из-за проблемы с ним, ошибка в Oracle или когда сеансы убит администратором. Лучшим способом диагностики таких проблем является поиск в базе данных alert.log, соответствующий времени, когда вы получили ошибку с содержимым журнала. Если сеанс скончался на сервере, появится запись о том, что сеансы были завершены, а путь к файлу трассировки содержит дополнительную информацию об отключении. Если это ошибка Oracle, которая вызывает ее, вам придется искать правильное исправление через Oracle Support.

Кроме того, пользователь может быть связан с профилем Oracle, который настроил CONNECTION_TIME или IDLE_TIME. Чтобы отладить, если это является причиной проблемы, свяжите пользователя с профилем Oracle без таких ограничений.

+0

Ошибка не появилась, так как я разместил вопрос, но этот ответ очень хорошо продумал и представляет несколько потенциальных клиентов. Большое спасибо, я уверен, ваши предложения помогут решить проблему. –

+0

Добро пожаловать! – Gui