Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 跨线程共享的django连接导致超出ora-01000最大打开游标数_Python_Django_Multithreading_Oracle_Orm - Fatal编程技术网

Python 跨线程共享的django连接导致超出ora-01000最大打开游标数

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是此配方中的一个函数:。它将函数(即游标。执行)包装在单独的线程中,并等待

如果SQL语句运行时间太长,我想停止执行它

为了实现这一点,我对django.core.db.backends.oracle.base进行了黑客攻击。在
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))