使用SQL Server 2014和Pyodbc的偶发信号量超时

时间:2019-05-16 07:22:08

标签: sql-server pyodbc

当插入SQL Server时,我有一个奇怪的信号超时问题。以下是可以重现此问题的简短代码段。

运行相同代码库的所有同事都没有数据库问题。我们还有一个应用服务器,可以保持连接数据库数小时而不会出现问题。笔记本电脑上运行的不同之处是:1)我拥有与同事不同的最新Dell Precision 5530; 2)我的同事使用python 3.5 / 3.6 / Windows 7&Linux时,我正在使用Anaconda / Python 3.7 / pyodbc 4.0.26 / Windows 10的最新副本。谷歌搜索建议我尝试更新我尝试过的网络适配器驱动程序,并将其安装在最新的驱动程序上。

有人看到过类似的问题吗?

[编辑1]由于以下建议,我已更新为更新的驱动程序,但出现了其他错误。

import time
import pyodbc

cxn = pyodbc.connect('DSN=db;DATABASE=db;Uid=user;Pwd=password', autocommit=True)

def insert(cxn):
    ids = [(i, ) for i in range(100000)]
    cur = cxn.cursor()
    cur.fast_executemany = True
    cur.execute('create table #tmp (unique_id int)')
    # cur.commit()
    print(1)
    cur.executemany('insert into #tmp values (?)', ids)
    # cur.commit()
    print(2)
    cur.execute('create unique index tmp_pk on #tmp (unique_id)')
    # cur.commit()
    print(3)
    cur.execute('select * from #tmp')
    print(4)
    cur.execute('drop table #tmp')

for i in range(1000):
    print('loop {} {}'.format(i, time.time()))
    insert(cxn)
    time.sleep(60)

在ipython中经过多次迭代之后:

loop 6 1557992375.617378
1
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
<ipython-input-1-8ceea4a06017> in <module>
     23 for i in range(1000):
     24         print('loop {} {}'.format(i, time.time()))
---> 25         insert(cxn)
     26         time.sleep(60)

<ipython-input-1-8ceea4a06017> in insert(cxn)
     11         # cur.commit()
     12         print(1)
---> 13         cur.executemany('insert into #tmp values (?)', ids)
     14         # cur.commit()
     15         print(2)

OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.\r\n (10060) (SQLExecute); [08S01] [Microsoft][ODBC Driver 17 for SQL Server]Communication link failure (10060)')

错误是:

  

[08S01] [Microsoft] [用于SQL Server的ODBC驱动程序17] TCP提供程序:

     

连接尝试失败是因为被连接方在一段时间后未正确响应,或者建立连接失败是因为连接的主机未响应。

     

(10060)(SQLExecute); [08S01] [Microsoft] [用于SQL Server的ODBC驱动程序17]通信链接失败(10060)')

1 个答案:

答案 0 :(得分:0)

这看起来像是一个客户端错误,但是不希望得到修复。本机客户端is deprecated

  

重要

     

SQL Server本机客户端(SQLNCLI)仍被弃用,不建议将其用于新的开发工作。

Microsoft现在推荐ODBC已有一段时间,并将其大部分精力放在了这里。这是完全可以理解的,因为那是唯一可以在Linux上运行的功能。

SQL Server文档站点包含Python上的整个部分,以及pyodbcpymssql的示例。正如他们解释的那样:

  

但是,Microsoft将测试工作和对pyodbc驱动程序的信心放在了首位。

您可以找到Windows,MacOS和各种Linux发行版here的ODBC驱动程序。

pyodbc的示例很简单,不需要DSN:

import pyodbc 
# Some other example server values are
# server = 'localhost\sqlexpress' # for a named instance
# server = 'myserver,port' # to specify an alternate port
server = 'tcp:myserver.database.windows.net' 
database = 'mydb' 
username = 'myusername' 
password = 'mypassword' 
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()