如果运行时间太长,我想停止执行SQL语句。
为实现这一点,我入侵了django.core.db.backends.oracle.base
。在FormatStylePlaceholderCursor.execute
和executemany
而不是:
return self.cursor.execute(TIMEOUT, query, self._param_generator(params))
我做:
return timelimited(TIMEOUT, self.cursor.execute, query, self._param_generator(params))
timelimited
是此食谱中的函数:http://code.activestate.com/recipes/576780-timeout-for-nearly-any-callable/。它将函数(即cursor.execute
)包装在单独的线程中并等待TIMEOUT
。如果函数没有返回,则线程停止。
通过这个修改,我正在运行的应用程序在短时间内抛出ora-01000最大游标。我在徘徊为什么包裹cursor.execute
导致了这个问题,如何修复它以及这个问题的其他可用解决方案。
答案 0 :(得分:0)
我不熟悉Django和Python。我可以告诉你OCI驱动程序为用户提供了什么。
This就是您所需要的。 Connection.cancel()