4

MS SQLサーバーにアクセスできなくなったときに、これに遭遇しました。これにより、コードにバグが発生し、プログラムが急停止し、もちろんユーザーの熊手や松明がドアに届きました。問題を要約すると、ユーザーのボブがダウンしたデータベースに接続しようとすると、もちろんプログラムが接続を試みるまで待機します。この時点でボブが待機しているときに、2番目のユーザーであるジョーが接続を試みた場合、彼も待機します。しばらくすると、ボブはタイムアウトになり、適切なエラーが発生します。ただし、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およびpython2.6.6。

4

1 に答える 1

2

pymssqlのユーザーグループにも質問をして、すべての拠点をカバーしました。開発者の1人によると、現在の安定版リリースではpymssqlはスレッドセーフではありません。開発1.9リリースまたは次のメジャー2.0リリースにあるようです。おそらく別のモジュールに切り替えるか、何らかの接続プールを使用する可能性がありますが、それはおそらく包帯の修正であり、実際には理想的ではありません。

于 2011-08-25T15:29:29.740 に答える