【问题标题】:Multithreaded pyodbc connection多线程pyodbc连接
【发布时间】:2018-12-17 09:33:19
【问题描述】:

我正在尝试在多个线程中使用 pyodbc 连接。我收到以下错误:Connection is busy with results for another command (0) (SQLExecDirectW)')。我也尝试设置MultipleActiveResultSets=yes; 并得到相同的结果。

我真的不想为每个线程或查询创建一个连接。我也不想使用锁来序列化来自所有线程的查询。

我首先使用驱动程序“SQL Server”,然后迁移到“SQL Server Native Client 11.0”,但没有成功。

有什么建议吗?

【问题讨论】:

  • 您是否反对让连接等待被释放,然后在另一个线程中再次使用它?
  • @JoshuaSchlichting 是的,这就是我不想用锁序列化线程的意思。不过我可能别无选择。
  • 是的,我看不出您还有什么其他选择。我不知道您的限制为何如此,但我会选择为每个线程创建一个新连接。
  • 谢谢你的建议,约书亚。
  • 从 ODBC 驱动程序的名称看来,您是在 Windows 上执行此操作,并且 Windows ODBC 默认为 SQL Server 驱动程序启用连接池,因此可能不一定为每个线程打开单独的连接像你担心的那么贵。

标签: python sql multithreading pyodbc


【解决方案1】:

由于这个问题需要建议而不是真正的有力答案,所以这是我的:

首先,我建议为每个创建的线程创建一个新连接。

或者,如果您可以终止当前正在执行的内容,请在重用连接之前尝试 cursor.cancel()。

另外,经过快速搜索,我发现多个与此问题相关的Multiple Active Result Sets 引用。如果您的数据库支持它,请尝试将“MultipleActiveResultSets=True”添加到您的连接字符串中。

我希望这些建议之一可以帮助您到达您需要的地方!

【讨论】:

    【解决方案2】:

    根据 ODBC 文档 https://docs.microsoft.com/en-us/sql/relational-databases/native-client/applications/using-connection-string-keywords-with-sql-server-native-client?view=sql-server-ver15,您应该使用的关键字是 MARS_Connection=yes。将它与 pyodbc 一起使用确实有效并解决了我的双打开光标问题。

    使用MultipleActiveResultSets=true 不起作用有两个原因:使用不正确的关键字和使用不正确的值,因为 ODBC 标志不是 true/false,它们是 /

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 2014-01-13
      相关资源
      最近更新 更多