pyodbc 的超时在 Windows 上不起作用



我的代码:

import pyodbc
connection = pyodbc.connect("DRIVER={SQL Server};SERVER=MYSERVER;DATABASE=mydatabase;Trusted_Connection=yes")
connection.timeout = 3
cursor = connection.cursor()
results = cursor.execute("SELECT * FROM someLongTable").fetchall()

超时参数将被忽略,查询的运行时间与完成所需的时间(几分钟)一样长。

这与这家伙遇到的问题相同,但对他有效的解决方案对我不起作用。现在,与他不同,我在Windows上(客户端和服务器都是Windows机器)。我知道信号在Windows上效果不佳,有时人们使用信号来编写超时函数,所以也许Windows是这里的问题?难道是这样?如果是这样,是否有任何解决方法?

(Python 2.7.9, pyodbc 3.0.7, Windows Server 2012, MSSQL 2012)

我找到了一个解决方法:逐个检索结果,计算总运行时间,如果超过 ~30 秒,则放弃。

import time
import pyodbc
def getMSSQLdata(cursor):
    connection = pyodbc.connect("DRIVER={SQL Server};SERVER=MYSERVER;DATABASE=mydatabase;Trusted_Connection=yes")
    cursor = connection.cursor()
    results = []
    t0 = time.time()
    while True:
        if (time.time() - t0) < 30:
            next = cursor.fetchone()
            if next:
                results.append(next)
            else:
                print "query executed in {} seconds".format(time.time() - t0)
                return results
        else:
            print "aborted - query took longer than 30 seconds"
            return None # or raise some exception

当然,您可以修改它以在超过一定数量的行(而不是特定时间)后中止。或者只返回前 ~30 秒内检索到的任何行。等等。

(虽然它并不漂亮 - 而且并不精确。我希望我能弄清楚为什么pyodbc的超时参数在Windows中被忽略。

我知道

这是一个老问题,但我只是遇到了同样的问题,但在pypyodbc中,并且已经解决了为什么它不起作用。

基本上查询超时有效,但不适用于 .fetchall()

t = time()
sqlStatement = " SELECT TOP (20000) * FROM BigTable"
DSN="Driver={SQL Server};Server=Server;Database=Database;Trusted_Connection=yes" 
cnxn  = pypyodbc.connect(DSN)
cnxn.timeout = 1
cursor = cnxn.cursor()
print (time()- t)
cursor.execute(sqlStatement)
print (time()- t)
results = cursor.fetchall()
print (time()- t)

给出以下结果:

0.09884047508239746
0.2534453868865967
3.447007894515991

相关内容

  • 没有找到相关文章

最新更新