我希望将我的python程序从普通连接更改为连接池,这样当几个小时没有发送任何查询时,数据库连接就不会丢失,同时数据库也不会在使用高峰时立即被一堆查询淹没。
我使用的是Python3.7.4、mysql-connector-python8.0.17和MariaDB 10.4.7。当我使用普通连接时,它工作得很好,但是MariaDB显然不支持mysql.connector.pooling.MySQLConnectionPool的pool_reset_session设置
在我的代码一开始,如果数据库还不存在,它会尝试创建数据库,这导致了我得到的错误。
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。
发布于 2019-12-31 11:32:32
我用mysql-connector-python for mariaDB也遇到了同样的问题,我把mysql-connector-python版本降级到了8.0.12,这对我很有效。
发布于 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文件的服务器部分。
配置如下:
[server]
. . .
version=5.7.99-10.4.10-MariaDB连接器将看到版本5.7.99,并有相应的行为。
发布于 2019-09-23 11:59:23
在将服务器版本升级到10.0时,MariaDB必须在服务器版本上添加前缀,以避免中断复制(复制协议需要一个一位数的主版本号,有关更多信息,请查看此answer)。
无论您使用的是Python10.0还是10.4,MySQL连接器/Python都将始终返回版本号5.5.5:
>>> 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)中:
+ if server_version.startswith("5.5.5-")
+ server_version= server_version[6:]这当然不是一个通用的解决方案,因为它不适用于10.2之前的MariaDB版本。在检查诸如X协议之类的某些特性时,它也可能会产生不良的副作用,而X协议是MariaDB不支持的。
https://stackoverflow.com/questions/58044497
复制相似问题