#python #mysql #connection-pooling
#python #mysql #объединение пулов соединений
Вопрос:
У меня есть проблема, связанная с пулом подключений, но я ее не понимаю.
Ниже приведен мой код, и это поведение:
- Начиная с пустой таблицы, я ВЫБИРАЮ запрос для несуществующего значения (без результатов)
- Затем я выполняю запрос INSERT, он успешно вставляет значение
- ОДНАКО после вставки нового значения, если я попытаюсь выполнить больше инструкций SELECT, он работает только 2 раза из 3, всегда терпит неудачу ровно при каждой 3-й попытке (с размером пула = 3. т.е. с размером пула = 10 он будет работать ровно 9 из 10 раз)
- наконец, если я перезапущу скрипт, начальный выбор будет закомментирован (но значение указано в таблице перед значениями скрипта) Я получаю вставленное значение, и оно работает каждый раз.
Почему этот код, похоже, «застревает, возвращая пустой результат для соединения, которое не дало результата», до перезапуска скрипта?
(обратите внимание, что он продолжает открывать и закрывать соединения из пула соединений, потому что это берется из веб-приложения, где каждое подключение / закрытие представляет собой отдельный веб-запрос. Здесь я вырезал из него весь «веб» аспект)
#!/usr/bin/python
import mysql.connector
dbvars = {'host':'h','user':'u','passwd':'p','db':'d'}
# db has 1 empty table 'test' with one varchar field 'id'
con = mysql.connector.connect(pool_name="mypool", pool_size=3, pool_reset_session=False, **dbvars)
cur = con.cursor()
cur.execute("SELECT id FROM test WHERE id = '123';")
result = cur.fetchall()
cur.close()
con.close()
con = mysql.connector.connect(pool_name="mypool")
cur = con.cursor()
cur.execute("INSERT INTO test VALUES ('123');")
con.commit()
cur.close()
con.close()
for i in range(12):
con = mysql.connector.connect(pool_name="mypool")
cur = con.cursor()
cur.execute("SELECT id FROM test WHERE id = '123';")
result = cur.fetchall()
cur.close()
con.close()
print result
Результат приведенного выше:
[(u'123',)]
[]
[(u'123',)]
[(u'123',)]
[]
[(u'123',)]
[(u'123',)]
[]
[(u'123',)]
[(u'123',)]
[]
[(u'123',)]
Опять же, если я не выполняю начальный ВЫБОР перед вставкой, то все они возвращают 123 (если он уже есть в БД). Кажется, что начальный ВЫБОР «повреждает» одно из соединений пула подключений. Кроме того, если я делаю 2 выбора для пустых результатов перед вставкой, то 2 из 3 соединений «повреждены». Наконец, если я делаю 3 выбора перед вставкой, он все равно работает 1 из 3 раз, потому что кажется, что ВСТАВКА «исправляет» соединение (предположительно, имея «результаты»).
- Ubuntu 18.04
- Python 2.7.17 (выпущен в октябре 2019)
- mysql-connector-python 8.0.21 (июнь 2020)
- Сервер MySQL 5.6.10
Ответ №1:
Похоже, это довольно серьезная ошибка в драйвере python для MySQL. Возможно, какая-то несовместимость конфигурации, но явно ошибка, поскольку ошибка не отображается, но возвращает неправильные результаты запроса.
Я отправил отчет об ошибке в команду MySQL, и в настоящее время его статус «проверен».