Есть ли способ использовать 'pool_reset_connection' из mysql-connector-python с MariaDB 10.4.7? - PullRequest
0 голосов
/ 22 сентября 2019

Я хочу изменить свою программу на python с обычного соединения на пул соединений, чтобы соединение с базой данных не потерялось, если в течение нескольких часов не было отправлено ни одного запроса, а также чтобы база данных не была перегружена кучей запросовсразу при пиковой нагрузке.

Я использую Python 3.7.4, mysql-connector-python 8.0.17 и MariaDB 10.4.7.Он работает нормально, когда я использую обычное соединение, но MariaDB, очевидно, не поддерживает настройку pool_reset_session 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.

, а также

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

Из журналов трассировки похоже, что это вызвано попыткой выполнить db.close() в строке 17.

Полный вывод с трассировкой: https://pastebin.com/H3SAvA9N

Я спрашиваю, что я могу сделать, чтобы это исправить, и если вообще возможно использовать этот вид пула соединений с MariaDB 10.4.7 (я запуталсяпотому что он говорит, что MySQL <= 5.7.2 не поддерживает этот сброс соединений после использования, хотя я использую MariaDB 10.4.7) </p>

Я также обнаружил, что MariaDB Connector / J предоставляет такую ​​возможность,называется useResetConnection но я не хочу изучать Java толькодля этой функции.

1 Ответ

0 голосов
/ 23 сентября 2019

При повышении версии сервера до 10.0 MariaDB пришлось добавить префикс к версии сервера, чтобы избежать прерывания репликации (протокол репликации ожидает однозначный основной номер версии, для получения дополнительной информации проверьте этот ответ ).

Независимо от того, используете ли вы MariaDB 10.0 или 10.4, MySQL Connector / 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 Connector / Python, например, в _check_server_version (abstracts.py):


+        if server_version.startswith("5.5.5-")
+            server_version= server_version[6:]

Это, конечно, не универсальное решение, так как ононе будет работать для версий MariaDB до 10.2.Это может также иметь плохие побочные эффекты при проверке некоторых функций, таких как X-Protocol, который не поддерживается MariaDB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...