Python sql 连接池未更新值
Python sql connection pool not updating value
我有一个与连接池相关的问题,但我不明白。
下面是我的代码,这是行为:
- 从空 table 开始,我 SELECT 查询不存在的值(无结果)
- 然后我执行 INSERT 查询,它成功插入了值
- 但是,在插入一个新值后,如果我尝试执行更多 SELECT 语句,它只能工作 3 次中的 2 次,每 3 次尝试总是失败(池大小 = 3。即池size=10 10 次中有 9 次有效)
- 最后,如果我重新启动脚本,初始 SELECT 被注释掉(但值在脚本之前的 table 中)我得到插入的值并且它每次都有效。
为什么这段代码似乎 'get stuck returning empty result for the connection that had no result' 直到重新启动脚本?
(请注意,它会不断打开和关闭来自连接池的连接,因为这是从一个 Web 应用程序中获取的,其中每个 connect/close 都是一个不同的 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,那么所有这些 return 123(如果它已经在数据库中)。好像初始SELECT'corrupts'连接池的连接之一。此外,如果我在 INSERT 之前为空结果执行 2 SELECTs,那么 3 个连接中的 2 个是 'corrupt'。最后,如果我在插入之前执行 3 SELECTs,它仍然可以工作 3 次中的 1 次,因为看起来 INSERT 'fixes' 连接(大概是通过 'results')。
- Ubuntu 18.04
- Python 2.7.17(2019 年 10 月发布)
- mysql-连接器-python 8.0.21(2020 年 6 月)
- MySql 服务器 5.6.10
这似乎是 MySQL 的 python 驱动程序中的一个相当严重的错误。也许有些配置不兼容,但显然是一个错误,因为没有显示错误,但它 returns 错误的查询结果。
我向 MySQL 团队提交了错误报告,目前状态为 'verified'。
我有一个与连接池相关的问题,但我不明白。
下面是我的代码,这是行为:
- 从空 table 开始,我 SELECT 查询不存在的值(无结果)
- 然后我执行 INSERT 查询,它成功插入了值
- 但是,在插入一个新值后,如果我尝试执行更多 SELECT 语句,它只能工作 3 次中的 2 次,每 3 次尝试总是失败(池大小 = 3。即池size=10 10 次中有 9 次有效)
- 最后,如果我重新启动脚本,初始 SELECT 被注释掉(但值在脚本之前的 table 中)我得到插入的值并且它每次都有效。
为什么这段代码似乎 'get stuck returning empty result for the connection that had no result' 直到重新启动脚本?
(请注意,它会不断打开和关闭来自连接池的连接,因为这是从一个 Web 应用程序中获取的,其中每个 connect/close 都是一个不同的 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,那么所有这些 return 123(如果它已经在数据库中)。好像初始SELECT'corrupts'连接池的连接之一。此外,如果我在 INSERT 之前为空结果执行 2 SELECTs,那么 3 个连接中的 2 个是 'corrupt'。最后,如果我在插入之前执行 3 SELECTs,它仍然可以工作 3 次中的 1 次,因为看起来 INSERT 'fixes' 连接(大概是通过 'results')。
- Ubuntu 18.04
- Python 2.7.17(2019 年 10 月发布)
- mysql-连接器-python 8.0.21(2020 年 6 月)
- MySql 服务器 5.6.10
这似乎是 MySQL 的 python 驱动程序中的一个相当严重的错误。也许有些配置不兼容,但显然是一个错误,因为没有显示错误,但它 returns 错误的查询结果。
我向 MySQL 团队提交了错误报告,目前状态为 'verified'。