首页 > 解决方案 > Python sql连接池不更新值

问题描述

我有一个与连接池有关的问题,但我不明白。

下面是我的代码,这是行为:

  1. 从空表开始,我对不存在的值进行 SELECT 查询(无结果)
  2. 然后我做 INSERT 查询,它成功插入了值
  3. 但是,在插入一个新值之后,如果我尝试执行更多的 SELECT 语句,它只能工作 3 次中的 2 次,每次第三次尝试总是失败(池大小 = 3。即池大小 = 10,它将正好工作 9 次10 次)
  4. 最后,如果我重新启动脚本,将初始 SELECT 注释掉(但该值在脚本之前的表中)我得到插入的值并且它每次都有效。

为什么在重新启动脚本之前,这段代码似乎“卡在为没有结果的连接返回空结果”?

(请注意,它会不断打开和关闭来自连接池的连接,因为这是从 Web 应用程序中获取的,其中每个连接/关闭都是不同的 Web 请求。在这里,我将整个“Web”方面从其中删除)

#!/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(如果它已经在 db 中)。最初的 SELECT 似乎“破坏”了连接池的一个连接。此外,如果我在 INSERT 之前为空结果执行 2 次 SELECT,则 3 个连接中有 2 个是“损坏的”。最后,如果我在插入之前执行 3 次 SELECT,它仍然可以工作 3 次中的 1 次,因为似乎 INSERT“修复”了连接(大概是通过“结果”)。

标签: pythonmysqlconnection-pooling

解决方案


这似乎是 MySQL 的 python 驱动程序中的一个相当严重的错误。也许一些配置不兼容,但显然是一个错误,因为没有显示错误,但它返回错误的查询结果。

我向 MySQL 团队提交了错误报告,其状态目前为“已验证”。

https://bugs.mysql.com/bug.php?id=102053


推荐阅读