下面代码的目的是使用 pyodbc 和 mysql 并行执行多个数据库更新。问题:连接是否独立且并行打开?这段代码可以工作还是我需要采取不同的方法?我尝试研究 pyodbc 和多线程,但没有发现太多。
import multiprocessing, pyodbc
tables = ['tab1', 'tab2', 'tab3', 'tab4', 'tab5', 'tab6']
for table in tables:
p = multiprocessing.Process(target=process_table, args=(table,))
p.start()
def process_table(table):
conn = pyodbc.connect(.....)
cursor = conn.cursor()
for i in range(0, 10):
sql = 'update ' + table + ' set col = ' + str(i)
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()
咱们进入正题吧。
这是有关如何使用线程执行此操作的示例代码:
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import pyodbc
executor = ThreadPoolExecutor() # or ProcessPoolExecutor
tables = ['tab1', 'tab2', 'tab3', 'tab4', 'tab5', 'tab6']
futures = []
for table in tables:
result = executor.submit(process_table, table)
futures.append(result)
results = [future.result() for future in futures]
def process_table(table):
conn = pyodbc.connect(.....)
cursor = conn.cursor()
for i in range(0, 10):
sql = 'update ' + table + ' set col = ' + str(i)
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()
让我们深入研究 ODBC 中的一些有用参数,如参考中所列:
参数 | 描述 |
---|---|
SQL_MULT_RESULT_SETS | 字符串:如果数据源支持多个结果集,则为“Y”;如果不支持,则为“N”。有关多个结果集的更多信息,请参阅多个结果。 |
SQL_MULTIPLE_ACTIVE_TXN | 一个字符串:如果驱动程序同时支持多个活动事务,则为“Y”;如果任何时候只能有一个事务活动,则为“N”。该信息类型返回的信息不适用于分布式事务。 |
SQL_MAX_DRIVER_CONNECTIONS | 一个 SQLUSMALLINT 值,指定驱动程序可以支持的环境的最大活动连接数。此值可以反映驱动程序或数据源施加的限制。如果没有指定限制或限制未知,则该值设置为零。 |
如果语句有未决结果,则该语句被定义为活动状态,术语“结果”表示来自 SELECT 操作的行或受影响的行通过 INSERT、UPDATE 或 DELETE 操作(例如行计数),或者处于 NEED_DATA 状态。该值可以反映驱动程序或数据源施加的限制。如果没有指定限制或限制未知,则该值设置为零。 | |
一个 SQLUINTEGER 值,指定驱动程序在给定连接上可以支持的异步模式下活动并发语句的最大数量。 |
print(conn.getinfo(pyodbc.SQL_MAX_DRIVER_CONNECTIONS))
print(conn.getinfo(pyodbc.SQL_MAX_DRIVER_CONNECTIONS))
print(conn.getinfo(pyodbc.SQL_MAX_CONCURRENT_ACTIVITIES))
print(conn.getinfo(pyodbc.SQL_MAX_ASYNC_CONCURRENT_STATEMENTS))
此外,还有一个协议允许单个连接同时运行多个并发查询:SQL Server 2005 (9.x) 引入了一种新的连接属性,该属性允许应用程序每个连接有多个待处理请求,特别是每个连接有多个活动默认结果集,称为
多个活动结果集 (MARS) )
。此外,还添加了一个新的连接字符串关键字Mars_Connection
。它接受“是”或“否”值; “否”是默认值。对于 pyodbc,您可以通过将 MARS_Connection=yes
添加到连接字符串来启用它。使用火星