Django与Oracle数据库失去连接

1 投票
1 回答
1766 浏览
提问于 2025-04-30 21:25

我有一个使用Oracle 11数据库的Django项目。最近,我经常收到Django抛出的一个异常:

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

这个异常并不是由某个特定的Django视图引起的,它可能来自任何一个视图。

从错误追踪信息来看,这个异常似乎是在中间件中抛出的。没有任何第三方中间件可能导致这个问题,全部都是Django自带的标准中间件。

那么,在哪里查找这个问题的调试信息比较好呢?我在网上找到关于这个错误的信息非常少。Django.settings模块中的任何参数(比如数据库配置)会起作用吗?

暂无标签

1 个回答

2

这个错误可能有很多不同的原因:

连接池的配置

检查一下你的连接池是否有像超时生命周期这样的参数。我自己就遇到过这个参数导致的错误,ORA-03135,通常是在连接池的会话闲置一分钟后出现。对我来说,解决办法是使用非连接池的连接,但这对大多数应用来说并不实际。在你的情况下,设置一个更高的超时可能会解决问题。

尝试在Django和/或中间件上开启最高级别的调试,看看是否有关于会话在连接池中过期的日志信息。重启中间件,并记录它开始出现故障所需的时间。如果这个时间很短(比如60秒),你可能需要调整超时设置,并确保连接池有足够的会话来应对你的负载。

网络错误/防火墙

各种网络问题,比如数据包丢失或网卡故障,都可能导致连接中断。

为了调试这个问题,可以用Sqlplus连接到数据库并执行任意命令。然后,让会话保持不活动状态,分别等待10、20、30、60和120分钟(每次只尝试一个时间)。这样可以帮助你判断问题是否只出现在连接池中,还是在SQLPLUS中也会出现。如果后者成立,那可能是网络问题或配置(比如防火墙超时)导致会话因闲置而被关闭。尤其是如果会话总是在相同的时间间隔后断开(比如两小时后)。可以在其他机器上进行同样的实验,看看超时是否仍然发生。如果只在某些主机上出现,可能是与主机连接的交换机有问题。你的网络工程师可能需要介入。

在这种情况下,操作系统的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服务器端断开连接

数据库可能因为某些问题、Oracle的bug,或者管理员手动终止会话而断开连接。诊断这类问题的最好方法是查看数据库的alert.log,找到你出现错误时的日志内容。如果会话在服务器上断开,会有一条记录说明会话被终止,并提供一个指向包含断开连接额外信息的跟踪文件的路径。如果是Oracle的bug导致的,你需要通过Oracle支持寻找合适的解决方案。

另外,用户可能与一个配置了CONNECTION_TIME或IDLE_TIME的Oracle配置文件相关联。为了调试是否是这个原因导致的问题,可以将用户与一个没有这些限制的Oracle配置文件关联起来。

撰写回答