0

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

为了实现这一点,我破解了django.core.db.backends.oracle.base. 在FormatStylePlaceholderCursor.executeexecutemany不是:

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会导致这个问题,如何解决它以及这个问题的其他可用解决方案。

4

1 回答 1

0

我对 Django 和 Python 都不熟悉。我可以告诉你 OCI 驱动程序为用户提供了什么。

  • 您必须关闭查询句柄 - 或 Python 中的任何名称。否则你会在数据库端泄漏资源
  • 如果查询仍处于活动状态,您可以使用 OCIBreak 调用中断它。这是线程安全的,可以从任何线程调用,无论后台线程对连接做什么
  • 尝试检查 Oracle 的 Python 驱动程序是否允许您调用 OCIBreak 和 OCIReset

就是你需要的。Connection.cancel()

于 2013-11-14T11:47:08.647 回答