与 Windows 相比,Linux 上与 Microsoft SQL Server 的连接速度慢 5 倍

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

我在 LINUX MACHINE 上使用 Microsoft SQL 时遇到了大问题。

我已经设置了整个集群。我以为一切正常,然后发现所有 API 调用都非常慢..

设置

我的服务集群在我的办公室服务器机房中运行,并且我在旁边的 Windows 计算机上运行 Microsoft SQL Server。 现在,我对该 SQL Server 的请求比我之前的设置慢 5-6 倍,之前的设置是从 Windows 计算机上的 IIS 上运行的服务发送到 Windows 上运行的 SQL Server。

我运行了分析器,发现

pyodbc.connect
占用了 90% 的时间。

在 Windows 计算机上执行需要 500 毫秒的查询现在需要 5.2 秒,其中 4.46 秒被

pyodbc.connect

消耗

请帮忙。

我发现了这个https://www.unixodbc.org/doc/conn_pool.html 并更新了我的

odbcinst.ini
文件

[ODBC]
Trace = No
Trace File = /tmp/sql.log
Pooling = Yes

[ODBC Driver 18 for SQL Server]
Description=Microsoft ODBC Driver 18 for SQL Server
Driver=/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.4.so.1.1
UsageCount=1
CPTimeout=60

这就是我使用 pyodbc 读取查询的方式

DEFAULT_DRIVER_UNIX = "/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.4.so.1.1"
DEFAULT_DRIVER_ODBC_UNIX = "/usr/lib64/libmsodbcsql-18.so"
if platform.system() == "Linux":
    DEFAULT_DRIVER = DEFAULT_DRIVER_UNIX
    DEFAULT_DRIVER_ODBC = DEFAULT_DRIVER_UNIX


def create_db_string(*, server, database, username, password, driver=DEFAULT_DRIVER):
    return (
        f"Driver={driver};"
        f"Server={server};"
        f"Database={database};"
        f"uid={username};"
        f"pwd={password};"
        "Trusted_Connection=no;"
        "integratedSecurity=false;"
"TrustServerCertificate=yes;"
    )
    
   def read_from_db(db_string, query, sorting_index=None, descending=False):
    """given database connection string, and a query returns a sorted list
    of queried items from database"""
    conn = pyodbc.connect(db_string)
    cursor = conn.cursor()
    cursor.execute(query)
    return_list = list(cursor.fetchall())
    if sorting_index is not None:
        return_list.sort(key=lambda x: x[sorting_index], reverse=descending)
    return return_list

我根据上面提供的链接更改了

odbcinst.ini
文件。还是没有变化。

我也必须更改代码吗?如何解决这个问题?

sql-server odbc database-connection pyodbc
1个回答
0
投票

问题出在 unixodbc 版本上。

github问题供参考

您使用什么版本的 unixODBC 和 pyodbc? unixODBC 2.3.9 pyodbc 5.1.0

unixODBC 连接池

unixODBC 和 pyodbc 的最新(截至 2024 年 8 月)更新更改了 unixODBC 下连接池的行为。使用 libmsodbcsql-18.4.so.1.1(适用于 SQL Server 的 ODBC 驱动程序 18)和 pyodbc >= 5.1.0:

unixODBC <= 2.3.9 — Connection pooling does not work at all. pyodbc uses wide (Unicode) connection functions and unixODBC did not start supporting those for connection pooling until 2.3.10.

unixODBC == 2.3.11 — pyodbc 默认为 pyodbc.pooling = True 但 unixODBC 忽略该设置,因此默认情况下禁用连接池。将 Pooling = Yes 添加到 odbcinst.ini 的 [ODBC] 部分可启用连接池。详细信息请参阅此处的 unixODBC 文档。

unixODBC >= 2.3.12 — unixODBC 现在遵循 pyodbc.pooling 设置,因此默认情况下启用连接池。通过在第一次连接之前设置 pyodbc.pooling = False 可以完全禁用池化。通过将 CPTimeout = -1(不是当前记录的 0)添加到 odbcinst.ini 的驱动程序部分,可以禁用特定驱动程序的池化。请注意,pyodbc.pooling 设置优先于 odbcinst.ini 中的 Pooling = Yes/No 设置,因此后者无效。

更详细的讨论,请参阅第 774 期。

所以我按照这个脚本相应地更新了我的版本

sudo cp /etc/odbcinst.ini /etc/odbcinst.ini.bak
sudo cp /etc/odbc.ini /etc/odbc.ini.bak
sudo apt-get remove --purge unixodbc unixodbc-dev
sudo apt-get install -y build-essential wget curl gcc make libssl-dev
wget http://www.unixodbc.org/unixODBC-2.3.12.tar.gz
tar -xzvf unixODBC-2.3.12.tar.gz
cd unixODBC-2.3.12
./configure --prefix=/usr/local
make
sudo make install
sudo ldconfig
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
source ~/.bashrc

使用问题中提到的先前配置更新了我的 odbcinst.ini 文件和 odbc.ini 文件。

odbcinst -j

会给你unixodbc版本 就是这样

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