Python 跨线程共享的django连接导致超出ora-01000最大打开游标数
如果SQL语句运行时间太长,我想停止执行它 为了实现这一点,我对django.core.db.backends.oracle.base进行了黑客攻击。在Python 跨线程共享的django连接导致超出ora-01000最大打开游标数,python,django,multithreading,oracle,orm,Python,Django,Multithreading,Oracle,Orm,如果SQL语句运行时间太长,我想停止执行它 为了实现这一点,我对django.core.db.backends.oracle.base进行了黑客攻击。在FormatStylePlaceholder游标中。执行和ExecuteMay,而不是: return self.cursor.execute(TIMEOUT, query, self._param_generator(params)) 我有: 并且timelimited是此配方中的一个函数:。它将函数(即游标。执行)包装在单独的线程中,并等待
FormatStylePlaceholder游标中。执行和ExecuteMay
,而不是:
return self.cursor.execute(TIMEOUT, query, self._param_generator(params))
我有:
并且timelimited
是此配方中的一个函数:。它将函数(即游标。执行
)包装在单独的线程中,并等待超时
。如果函数不返回,线程将停止
通过这次修改,我正在运行的应用程序在短时间内抛出ora-01000最大游标。我想知道为什么包装cursor.execute
会导致这个问题,如何解决它,以及这个问题的其他可用解决方案是什么。我对Django和Python都不熟悉。我可以告诉你OCI驱动程序为用户提供了什么
- 您必须关闭查询句柄——或者不管它在Python中的名称是什么。否则,您将泄漏数据库端的资源
- 如果查询仍然处于活动状态,可以使用OCIBreak调用中断查询。这是线程安全的,可以从任何线程调用,而不管后台线程对连接做什么
- 尝试检查Oracle的Python驱动程序是否允许您调用OCIREAK和OCIReset
这就是你需要的Connection.cancel()
它是什么意思?你能控制杀人程序吗?你为什么需要暂停?Oracle在解析查询时,会创建一个“程序”,并执行该程序。在查询关闭或数据库连接关闭之前,这将一直存在于Oracle内存中。可能是helpful@Ivan-我的意思是调用thread.stop()。我需要一个超时,因为这将是到缓存数据库的连接。若缓存数据库不可用或需要很长时间才能响应,我不会等待很长时间。我想取消执行并转到主数据库。@alko-这实际上没有帮助。请不要,我试图保护的情况下,连接断开-发生在中间的其他短查询,所以这需要处理在客户端。BTW,什么Python(Jython / cpython / pypyand版本),你使用吗?老实说,我不这是我所需要的东西。让我解释一下(只有四行代码,很抱歉注释中缺少格式):导入cx_Oracle作为db\n conn=db.connect(connect_string)\n#这里拔下以太网电缆。ping()将永远挂起\n确定,在这种情况下,您将面临DCD(死连接检测)问题。有很多关于这方面的文章,甲骨文也提出了一些建议。“最佳”方法是将奇怪的子句(ENABLE=breaked)
放入tnsnames.ora
条目中。这使得Oracle在网络连接上使用TCPKeepAlive。您将需要根权限。调整与TCPKeepAlive相关的几个内核级参数。诀窍在于,在这种情况下,DCD由Linux内核处理——这种方法确实有效。Connection.cancel()
中断DB服务器端的“线程”执行。哪种方法是将连接返回到池中的最快方法。当然,只有当您没有任何网络问题时,这才有效。
return timelimited(TIMEOUT, self.cursor.execute, query, self._param_generator(params))