使用pymssql时Segfault无法连接到多个线程上的服务器

时间:2011-08-24 21:20:48

标签: python pymssql

当我们的MS SQL服务器无法访问时,我们遇到过这种情况。这导致我们的代码中的错误导致我们的程序戛然而止,当然还有干草叉和用户的火把。我们已经能够将我们的问题归结为:如果用户Bob试图连接到被击落的数据库,他当然会在程序尝试连接时等待。如果在Bob等待的时候,第二个用户Joe试图连接,他也会等待。过了一会儿,鲍勃会超时,并提出适当的错误。但是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 个答案:

答案 0 :(得分:2)

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