首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在MariaDB 10.4.7中使用mysql-connector-python中的'pool_reset_connection‘?

有没有办法在MariaDB 10.4.7中使用mysql-connector-python中的'pool_reset_connection‘?
EN

Stack Overflow用户
提问于 2019-09-22 06:11:02
回答 3查看 2.5K关注 0票数 3

我希望将我的python程序从普通连接更改为连接池,这样当几个小时没有发送任何查询时,数据库连接就不会丢失,同时数据库也不会在使用高峰时立即被一堆查询淹没。

我使用的是Python3.7.4、mysql-connector-python8.0.17和MariaDB 10.4.7。当我使用普通连接时,它工作得很好,但是MariaDB显然不支持mysql.connector.pooling.MySQLConnectionPoolpool_reset_session设置

在我的代码一开始,如果数据库还不存在,它会尝试创建数据库,这导致了我得到的错误。

代码语言:javascript
复制
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.

以及

mysql.connector.errors.OperationalError: 1047 (08S01): Unknown command

从回溯日志看,这似乎是由尝试执行第17行中的db.close()引起的。

具有回溯功能的完整输出:https://pastebin.com/H3SAvA9N

我在问我能做些什么来解决这个问题,以及是否有可能在MariaDB 10.4.7中使用这种连接池(我感到困惑,因为它说MySQL <= 5.7.2不支持使用后重置连接,尽管我使用的是MariaDB 10.4.7)。

我还发现Java /J确实提供了这样一个选项,称为useResetConnection,但我不想仅仅为了这个特性而学习MariaDB。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-31 11:32:32

我用mysql-connector-python for mariaDB也遇到了同样的问题,我把mysql-connector-python版本降级到了8.0.12,这对我很有效。

票数 11
EN

Stack Overflow用户

发布于 2019-11-20 21:21:14

正如@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文件的服务器部分。

配置如下:

代码语言:javascript
复制
[server]
. . . 
version=5.7.99-10.4.10-MariaDB

连接器将看到版本5.7.99,并有相应的行为。

票数 5
EN

Stack Overflow用户

发布于 2019-09-23 11:59:23

在将服务器版本升级到10.0时,MariaDB必须在服务器版本上添加前缀,以避免中断复制(复制协议需要一个一位数的主版本号,有关更多信息,请查看此answer)。

无论您使用的是Python10.0还是10.4,MySQL连接器/Python都将始终返回版本号5.5.5:

代码语言:javascript
复制
>>> conn= mysql.connector.connect(user="foo")
>>> print(conn.get_server_version())
(5, 5, 5)
>>> cursor=conn.cursor()
>>> cursor.execute("select version()")
>>> row=cursor.fetchone()
>>> print(row)
('10.4.7-MariaDB-log',)

重置服务器端连接的COM_RESET_CONNECTION是在MariaDB 10.2中引入的,因此要使其工作,您必须更改MySQL连接器/Python的代码,例如在_check_server_version (abstracts.py)中:

代码语言:javascript
复制
+        if server_version.startswith("5.5.5-")
+            server_version= server_version[6:]

这当然不是一个通用的解决方案,因为它不适用于10.2之前的MariaDB版本。在检查诸如X协议之类的某些特性时,它也可能会产生不良的副作用,而X协议是MariaDB不支持的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58044497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档