是否可以通过MariaDB 10.4.7在mysql-connector-python中使用“ pool_reset_connection”?

时间:2019-09-21 22:11:01

标签: python-3.x mariadb mysql-connector-python

我想将我的python程序从普通连接更改为连接池,以使在几个小时内没有发送查询时数据库连接不会丢失,并且数据库不会被一堆查询淹没高峰时立即使用。

我正在使用Python 3.7.4,mysql-connector-python 8.0.17和MariaDB 10.4.7。 当我使用普通连接时,它可以正常工作,但是MariaDB显然不支持pool_reset_session的{​​{1}}设置

在我的代码开始时,如果数据库不存在,它将尝试创建数据库,这将导致我得到错误消息。

mysql.connector.pooling.MySQLConnectionPool

我希望这个代码片段可以创建数据库import mysql.connector as mariadb from mysql.connector import errorcode from mysql.connector import pooling cnx = mariadb.pooling.MySQLConnectionPool(user='root', password='password', host='localhost', pool_name='connectionpool', pool_size=10, pool_reset_session=True) try: db = cnx.get_connection() cursor = db.cursor() cursor.execute("CREATE DATABASE IF NOT EXISTS tests") print("Created database") except mariadb.Error as err: print(f"Failed creating database: {err}") finally: print("Finally (create)") db.close() ,但是却出现了以下两个错误:

tests

以及

mysql.connector.errors.NotSupportedError: MySQL version 5.7.2 and earlier does not support COM_RESET_CONNECTION.

从追溯日志看来,这是由于尝试在第17行执行mysql.connector.errors.OperationalError: 1047 (08S01): Unknown command引起的。

带回溯的完整输出: https://pastebin.com/H3SAvA9N

我在问我该怎么做才能解决此问题,以及是否可以在MariaDB 10.4.7中使用这种连接池(我很困惑,因为它说MySQL <= 5.7.2不支持此功能)使用后重置连接,即使我使用MariaDB 10.4.7)

我还发现MariaDB Connector / J确实提供了名为db.close()的选项,但我不想仅为此功能学习Java。

3 个答案:

答案 0 :(得分:1)

将服务器版本提高到10.0时,MariaDB必须在服务器版本上添加前缀,以免破坏复制(复制协议要求使用一位主版本号,有关更多信息,请检查此answer)。

无论您使用MariaDB 10.0还是10.4,MySQL Connector / Python始终返回版本号5.5.5:

COM_RESET_CONNECTION
MariaDB 10.2中引入了

+ if server_version.startswith("5.5.5-") + server_version= server_version[6:] 来重置服务器端的连接,因此要使其正常工作,您必须更改MySQL Connector / Python的代码,例如在_check_server_version(abstracts.py)中:

create table #temp (ChildRecord int,Parentrecord int)
insert into #temp values(101,102),(102,103),(103,104)


WITH CTE
     AS (SELECT t.ChildRecord,
                t.Parentrecord,
                1 lvl
         FROM #temp t
         UNION ALL
         SELECT c.ChildRecord,
                t.Parentrecord,
                lvl + 1
         FROM #temp t
              INNER JOIN CTE c ON t.ChildRecord = c.Parentrecord),
     CTE2
     AS (SELECT ChildRecord,
                MAX(lvl) maxlvl
         FROM cte
         GROUP BY ChildRecord)
     SELECT c.ChildRecord,
            c.Parentrecord
     FROM cte c
     WHERE EXISTS
     (
         SELECT 1
         FROM cte2 c2
         WHERE c2.maxlvl = c.lvl
               AND c2.ChildRecord = c.ChildRecord
     );
--select * from #temp

DROP TABLE #temp;

这当然不是通用解决方案,因为它不适用于10.2之前的MariaDB版本。在检查某些特性(例如X-Protocol)时,它可能还会产生不良的副作用,而MariaDB不支持该功能。

答案 1 :(得分:0)

正如@Georg Richter所指出的,MariaDB由于历史原因返回了一个类似 “ 5.5.5-10.4.10-MariaDB-1:10.4.10 + maria〜bionic-log”

MySQL python连接器显式检查版本(https://github.com/mysql/mysql-connector-python/blob/b034f25ec8037f5d60015bf2ed4ee278ec12fd17/lib/mysql/connector/connection.py#L1157),由于MariaDB服务器显示为5.5.5版本,因此引发错误。

自MariaDB 10.2.6起,您可以将version显式添加到cnf文件。

配置如下:

version=5.7.99-10.4.10-MariaDB

连接器将看到5.7.99版,并会相应运行。

答案 2 :(得分:0)

对于mariaDB,我在使用mysql-connector-python时也遇到了同样的问题,我将mysql-connector-python版本降级为8.0.12,对我来说有效