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

时间:2013-11-14 10:37:11

标签: python django multithreading oracle orm

如果运行时间太长,我想停止执行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导致了这个问题,如何修复它以及这个问题的其他可用解决方案。

1 个答案:

答案 0 :(得分:0)

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

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

This就是您所需要的。 Connection.cancel()