当无法在多个线程上连接到服务器时,pymssql 的段错误

Posted

技术标签:

【中文标题】当无法在多个线程上连接到服务器时,pymssql 的段错误【英文标题】:Segfault with pymssql when cannot connect to server on multiple threads 【发布时间】:2011-08-24 21:20:47 【问题描述】:

当我们的 MS SQL 服务器无法访问时,我们遇到了这种情况。这导致了我们代码中的一个错误,导致我们的程序突然停止,当然还有用户的干草叉和手电筒到我们家门口。我们已经能够将问题归结为:如果用户 Bob 尝试连接到故障数据库,他当然会在程序尝试连接时等待。如果此时 Bob 正在等待,第二个用户 Joe 尝试连接,他也会等待。一段时间后,Bob 将超时并引发适当的错误。然而,Joe 的连接将超时,并且出现分段错误,导致一切戛然而止。

我们已经能够使用以下代码可靠地重现此错误

import threading
import datetime
import time
import pymssql

class ThreadClass(threading.Thread):
    def run(self):
        now = datetime.datetime.now()
        print "%s connecting at time: %s" % (self.getName(), now)
        conn = pymssql.connect(host="10.255.255.1", database='blah',
                               user="blah", password="pass")


for i in range(2):
    t = ThreadClass()
    t.start()
    time.sleep(1)

这将在第一个线程引发错误后导致段错误。有没有办法阻止这个段错误,让它正确地引发错误,或者我在这里遗漏了什么?

Pymssql 版本 1.0.2 和 python 2.6.6。

【问题讨论】:

【参考方案1】:

我们还去 pymssql 的用户组询问了这个问题,以涵盖我们所有的基础。 According to one of the developers pymssql 在当前稳定版本中不是线程安全的。听起来它可能在开发 1.9 版本或下一个主要 2.0 版本中。我们可能会切换到不同的模块,或者可能会使用某种连接池,但这可能更像是一种绷带修复,并不是很理想。

【讨论】:

以上是关于当无法在多个线程上连接到服务器时,pymssql 的段错误的主要内容,如果未能解决你的问题,请参考以下文章

PHP 无法在 CentOS 7 上连接到 PostgreSQL

Taurus master 在 azure 上连接到同一网络中的 jmeter 从站时关闭测试运行

无法使用带有 Windows 身份验证的 pymssql 进行连接

无法使用 angular-js 在 Visual Studio 2013 上连接到 localdb

在 C++ 中使用 Qt 在 Linux 上连接到 Oracle DB

无法使用 pyodbc/pymssql 和 Robot Framework 连接到 SQL\Express