python - Django 和 Oracle DB 失去联系

标签 python django oracle oracle11g

我有一个使用 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/

相关文章:

python - 将 numpy 记录数组转换为字典列表的有效方法

python - Django 尝试将值保存到数据库,但当我尝试保存时值变成 NULL

SQL 聚合函数

mysql - mySql 与 Ms-Sql 和 Oracle 在连接具有排序结果集的表时的不同行为

oracle - 黑盒测试软件

python - Python Dict 中错误消息的优先级

python - 有没有更好的方法在 pygame 中创建瓦片 map ?

python pygame.camera.init() 没有视频捕捉

css - Django在css文件中使用背景图片的方法

python - 如何将 Avg() 舍入到最接近的整数? Django