我想将我的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。
答案 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,对我来说有效