为什么连接池在我的 Linux 映像中不能与 pyodbc 一起使用?

问题描述 投票:0回答:1

这是我用来检查池化是否正常工作的代码:

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
没有效果,池化不起作用(每次都有新连接)。

为什么行为不同以及如何解决问题?

sql-server pyodbc connection-pooling debian-based
1个回答
0
投票

经过一个小时的调查,我决定检查我的机器和映像中使用的组件的版本。我发现我的计算机上的驱动程序管理器 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 ./

瞧!问题已解决!

© www.soinside.com 2019 - 2024. All rights reserved.