我有一个使用Oracle 11数据库的Django项目。我经常从Django收到这个例外:
OperationalError: ORA-03135: connection lost contact
Process ID: 0
Session ID: 0 Serial number: 0
没有特定的Django视图导致异常。它可以来自任何视角。
从堆栈跟踪中,似乎从中间件中抛出了此异常。没有第三方中间件可能导致问题,它都是标准的Django内置。
哪里是寻找调试此问题的最佳位置?关于这个错误我在网上找不到什么。 Django.settings模块中的任何参数(例如DATABASES配置)都会起作用吗?
答案 0 :(得分:2)
导致此错误的原因有很多种:
配置连接池
检查您的连接池是否包含超时或生命周期等参数。我自己遇到了这个参数的问题,在一个池化会话不活动一分钟后导致错误ORA-03135。在我的案例中,解决方案是使用非池化连接,但这对大多数应用程序来说都不可行。在您的情况下,设置更高的超时可能会成功。
尝试在DJango和/或中间件上激活最高级别的调试,以查看它是否记录有关池中过期的会话的消息。重新启动中间件并计算启动失败所需的时间。如果时间很短(例如60秒),您可能希望更改超时并确保池有足够的会话负载。
网络错误/防火墙
丢包或网卡等各种网络问题都可能导致连接中断。
为了调试这个,使用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跟踪。这是通过在客户端和服务器sqlnet.ora文件上分别将参数配置为TRACE_LEVEL_CLIENT和TRACE_LEVEL_SERVER来完成的。要实现这一目标还需要其他参数。查看有关该主题的Oracle文档。
Oracle Server端断开连接
由于存在问题,数据库可能会断开会话,Oracle中存在错误或会话被管理员终止。诊断此类问题的最佳方法是查看数据库alert.log,该日期与您收到日志内容错误的时间相匹配。如果会话在服务器上死亡,则会有一个条目表明会话已终止,并且指向跟踪文件的路径包含有关断开连接的其他信息。如果是导致它的Oracle错误,则必须通过Oracle Support搜索正确的修复程序。
此外,用户可能与配置了CONNECTION_TIME或IDLE_TIME的Oracle配置文件相关联。为了调试是否是导致问题的原因,请将用户与没有此类限制的Oracle配置文件相关联。