PyODBC 需要 6 秒才能与 Azure SQL 服务器建立连接

PyODBC takes 6 seconds to establish a connection with Azure SQL Server

PyODBC 需要大约 7 秒才能与 Azure SQL 服务器建立连接,有没有办法将其最小化?

import os
import sys
import logging, logging.handlers
import getopt
import pyodbc
from database import *
    
# set up logging
logging.getLogger().setLevel(logging.INFO)

console = logging.StreamHandler()
console.setFormatter(logging.Formatter('%(asctime)s %(name)-12s %(levelname)s %(message)s'))
console.setLevel(logging.INFO)
logging.getLogger().addHandler(console)

logger = logging.getLogger("testapp")
def connect():
    return pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)

def purgeStoreData(conn, div_id, purge_days, lookback_days, store_start, store_end):
    store_list = get_store_list(conn, div_id, store_start, store_end)
    cursor = conn.cursor()
    for store in store_list:
       logger.info("Store %s ...", store)
       cursor.execute("some query")

if __name__ == "__main__":
    try:
        conn = connect()
        purgeStoreData(conn, DIV_ID, PURGE_DAYS, LOOKBACK_DAYS, STORE_START, STORE_END)
        logger.info("*** Completed succesfully")
    finally:
        conn.close()

有没有办法显示网络延迟?

能否尝试使用 SQL 服务器的 ODBC 驱动程序 17 进行连接?你可能会发现这种方式更快。

import pyodbc
server = '<server>.database.windows.net'
database = '<database>'
username = '<username>'
password = '{<password>}'   
driver= '{ODBC Driver 17 for SQL Server}'

with pyodbc.connect('DRIVER='+driver+';SERVER=tcp:'+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password) as conn:
    with conn.cursor() as cursor:
        cursor.execute("SELECT TOP 3 name, collation_name FROM sys.databases")
        row = cursor.fetchone()
        while row:
            print (str(row[0]) + " " + str(row[1]))
            row = cursor.fetchone()

Python 的 Microsoft 驱动程序是 here

还请将以下内容添加到连接字符串:“Encrypt=yes;TrustServerCertificate=no;”。当客户端首次尝试连接到 SQL Azure 时,它​​会发送一个初始连接请求。将此视为“预连接”请求。此时客户端不知道是否需要 SSL/Encryption 并等待来自 SQL Azure 的回答以确定在整个会话(不仅仅是登录序列,整个连接会话)中是否确实需要 SSL。在响应中设置了一个位来表示如此。然后客户端库断开连接并使用此信息重新连接。

当您将“加密连接”设置为“是”时,您避免了“预连接”并且连接速度更快。

此外,请验证您的互联网连接的延迟时间。