我有一个使用 Oracle 11 数据库的 Django 项目。我经常收到来自 Django 的异常:
OperationalError: ORA-03135: connection lost contact
Process ID: 0
Session ID: 0 Serial number: 0
没有特定的 Django View 导致异常。它可以来自任何 View 。
从堆栈跟踪来看,该异常似乎是从中间件内部引发的。没有可能导致问题的第三方中间件,它都是标准 Django 内置的。
哪里是调试此问题的最佳位置?我在网上发现关于此错误的信息很少。 Django.settings 模块中的任何参数(例如数据库配置)会起作用吗?
最佳答案
导致此错误的原因有很多:
连接池的配置
检查您的连接池是否有超时或生命周期等参数。我自己也遇到过此参数的问题,导致池 session 一分钟不活动后出现错误 ORA-03135。我的案例的解决方案是使用非池连接,但这对于大多数应用程序来说是不可行的。在您的情况下,设置更高的超时可能会成功。
尝试在 DJango 和/或中间件上激活最高级别的调试,以查看它是否记录有关池中 session 过期的消息。重新启动中间件并记录开始失败所需的时间。如果时间很短(例如 60 秒),您可能需要更改超时并确保池有足够的 session 来满足您的负载。
网络错误/防火墙
各种网络问题(例如丢包或网卡问题)都可能导致连接断开。
为了调试这个,请使用 Sqlplus 连接到数据库并运行任何给定的命令。之后,让 session 处于非事件状态 10、20、30、60 和 120 分钟(一次尝试一次)。这会让您知道问题是仅通过连接池发生还是通过 SQLPLUS 发生。如果后者为真,则可能是网络问题或配置(例如防火墙超时)导致 session 因不活动而终止。如果 session 总是在相同的时间间隔后(例如两小时后)终止,则尤其如此。在其他机器上尝试同样的实验,看看是否仍然出现超时。如果仅发生在某些主机上,则可能是该主机所连接的交换机存在问题。您的网络工程师可能需要参与其中。
在这种情况下,操作系统 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 服务器端断开连接
数据库可能会由于 session 问题、Oracle 中的错误或 session 被管理员终止而断开 session 。诊断此类问题的最佳方法是查看数据库alert.log,将错误发生的时间与日志内容相匹配。如果 session 在服务器上终止,则会有一个条目表明 session 已终止,并且跟踪文件的路径包含有关断开连接的其他信息。如果是 Oracle 错误导致的,您必须通过 Oracle 支持搜索正确的修复程序。
此外,用户可能与已配置 CONNECTION_TIME 或 IDLE_TIME 的 Oracle 配置文件关联。为了调试这是否是问题的原因,请将用户与没有此类限制的 Oracle 配置文件关联。
关于python - Django 和 Oracle DB 失去联系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26678020/