pyodbc 中单个连接的并发查询

concurrent queries with a single connection in pyodbc

我有一个 python 3.8 脚本,它使用库 pyobdc 和 concurrent.futures 来查询数据库。

NB 我想澄清一下,我知道我可以有多个连接,而且我确信它正在发生。我无法理解的是我的瓶颈在哪里

结构是:我有一个脚本(称为查询)作为模块导入到第二个脚本(称为主脚本)中。 查询是函数的集合,所有函数都具有相同的结构:

def getquery1():
    connection = pyobdbc.connect('connection string')
    query = 'SELECT * FROM table'
    with connection:
        result_dataset = pd.read_sql(con=connection,sql=query)
    connection.close()
    return result_dataset

在 main 中,我将该文件作为模块导入。 然后我记得所有数据为:

import queries
from concurrent.futures import ThreadPoolExecutor
import pyodbc

executor = ThreadPoolExecutor()
futureQuery1 = executor.submit(queries.getquery1)   
futureQuery2 = executor.submit(queries.getquery2)
futureQuery3 = executor.submit(queries.getquery3)
result1 = futureQuery1.result()
result2 = futureQuery2.result()
result3 = futureQuery3.result()

基础结构是:我有这个脚本在 linux 机器上运行并连接到 Microsoft SQL。使用的驱动程序是 FreeTDS 在 SQL 我得到了这个参数:

print(connection.getinfo(pyodbc.SQL_MAX_DRIVER_CONNECTIONS)) --> 0 (unlimited connections)
print(connection.getinfo(pyodbc.SQL_MAX_CONCURRENT_ACTIVITIES)) --> 1
print(connection.getinfo(pyodbc.SQL_MAX_ASYNC_CONCURRENT_STATEMENTS)) --> 1

事情是:

如果查询 1 和查询 2 在同一个连接上,这两个查询是同时执行的吗?或者 query2 必须等待 query1 结束?

如果 query3 连接到另一个数据库,该查询是否可以与前两个数据库同时执行?

在哪里可以找到这些参数?

我经常遇到主脚本同时从连接到同一台机器的两台不同机器运行的情况 docker

有用的链接:

有一种协议允许单个连接同时具有多个并发查询运行。这叫Multiple Active Result Sets, and I have no idea if FreeTDS uses it, but the Microsoft ODBC Driver可以。

然而,在单个连接上执行多个查询是交错 不是并发的。如果你想让两个查询真正同时执行,使用两个连接。