У меня проблема, связанная с пулом соединений, но я ее не понимаю.
Ниже мой код, и это поведение:
Почему этот код «зависает, возвращая пустой результат для соединения, которое не дало результата» до перезапуска скрипта?
(обратите внимание, что он продолжает открывать и закрывать соединения из пула соединений, потому что это взято из веб-приложения, где каждое соединение/закрытие является другим веб-запросом. Здесь я вырезал из него весь «веб-аспект»)
#!/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',)]
Опять же, если я не сделаю начальный SELECT перед вставкой, то все они вернут 123 (если он уже есть в БД). Кажется, что первоначальный SELECT «повреждает» одно из соединений пула соединений. Кроме того, если я делаю 2 SELECT для пустых результатов перед INSERT, то 2 из 3 соединений «повреждены». Наконец, если я делаю 3 SELECT перед вставкой, он все равно работает 1 из 3 раз, потому что кажется, что INSERT «исправляет» соединение (предположительно, имея «результаты»).
Кажется, это довольно серьезная ошибка в драйвере Python для MySQL. Возможно, некоторая несовместимость конфигурации, но явно ошибка, поскольку ошибка не отображается, но возвращает неправильные результаты запроса.
Я подал отчет об ошибке с командой MySQL, и в настоящее время его статус «проверен».