这是我用来检查池化是否正常工作的代码:
import os
import sys
import pyodbc
SERVER = os.environ['SERVER']
DATABASE = os.environ['DATABASE']
USERNAME = os.environ['USERNAME']
PASSWORD = os.environ['PASSWORD']
CONNECTION_STR = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
QUERY = "select MAX(login_time) as login_time from sys.dm_exec_sessions where login_name = ? and program_name like 'python%'"
pyodbc.pooling = sys.argv[1].lower() == 'true'
for i in range(0, 5):
with pyodbc.connect(CONNECTION_STR) as connection:
cursor = connection.cursor()
cursor.execute(QUERY, USERNAME)
row = cursor.fetchone()
print(row[0])
这个想法是,
login_time
由服务器在连接启动时设置一次,可以用作新旧连接的鉴别器。
此代码在我的计算机(MacOS)上按预期工作,并遵循将
pyodbc.pooling
设置为 true/false 的脚本参数,但我的目标是检查它在产品设置中的工作方式,因此我正在图像上测试它:
FROM mcr.microsoft.com/azure-functions/python:4-python3.10-core-tools
RUN curl -s https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
RUN curl -s https://packages.microsoft.com/config/debian/11/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update
RUN ACCEPT_EULA=Y apt-get install -y msodbcsql18
RUN pip install --upgrade pip --user
RUN pip install pyodbc
ENV PYTHONUNBUFFERED=TRUE
WORKDIR /app
ADD check_pooling.py ./
docker build -t pyodbc_cp .
docker run -e ... pyodbc_cp python check_pooling.py true
这里的情况有所不同:
pyodbc.pooling
没有效果,池化不起作用(每次都有新连接)。
为什么行为不同以及如何解决问题?
经过一个小时的调查,我决定检查我的机器和映像中使用的组件的版本。我发现我的计算机上的驱动程序管理器 unixodbc 是较新的版本 2.3.12,而映像的版本是 2.3.11,因为它是 Debian feed 中截至 2024 年 3 月的最新版本。
我按照步骤手动安装2.3.12版本:
FROM mcr.microsoft.com/azure-functions/python:4-python3.10-core-tools
WORKDIR /root
# Download and install unixodbc 2.3.12
RUN curl -sO https://www.unixodbc.org/unixODBC-2.3.12.tar.gz
RUN gunzip unixODBC*.tar.gz
RUN tar xvf unixODBC*.tar
WORKDIR /root/unixODBC-2.3.12
RUN ./configure
RUN make
RUN make install
WORKDIR /root
RUN apt-get update
# Install dependencies of msodbcsql18 except unixodbc
RUN apt-get install -y libc6 libstdc++6 libkrb5-3 openssl debconf odbcinst
RUN curl -s https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
RUN curl -s https://packages.microsoft.com/config/debian/11/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
# Install msodbcsql18 ignoring unixodbc dependency
RUN apt-get download msodbcsql18
RUN ACCEPT_EULA=Y dpkg --ignore-depends=unixodbc -i msodbcsql18_18.3.2.1-1_amd64.deb
RUN pip install --upgrade pip --user
RUN pip install pyodbc
ENV PYTHONUNBUFFERED=TRUE
ADD check_pooling.py ./
瞧!问题已解决!