【发布时间】:2018-11-16 22:13:12
【问题描述】:
我有一个基于 Python 2.7 和 Tornado 框架的大型旧项目。为了使用 MySQL,它最初使用 Tornado-MySQL 和原始 SQL 查询,并且运行良好,但现在它必须使用 MySQL 8,并且该库已过时,无人维护。
所以,现在我设置了TorMySQL 库——它可以很好地连接到 MySQL Server 8,但我不完全了解如何使用它,这会导致很多错误。
在一个项目的文件中,我编写了这段代码来访问数据库:
from tornado import gen
from tornado.gen import Return
from tornado.ioloop import IOLoop
import tormysql
import settings
POOL = tormysql.ConnectionPool(
max_connections = 20,
idle_seconds = 7200, #timeout time, 0 is not timeout
wait_connection_timeout = 3,
host='127.0.0.1',
port=3306,
user=settings.MYSQL_USER,
passwd=settings.MYSQL_PASSWORD,
db='aivanf',
use_unicode=True,
charset='utf8mb4')
@gen.coroutine
def executePool(query, params):
with (yield POOL.Connection()) as conn:
with conn.cursor() as cursor:
try:
yield cursor.execute(query, params)
except Exception, ex:
print('Exception!\n{}'.format(ex))
yield conn.rollback()
raise Return(None)
else:
first = query[:10].lower()
if 'update' in first or 'insert' in first:
yield conn.commit()
if 'select' in first:
raise Return(cursor.fetchall())
else:
raise Return(None)
我使用 if 是因为这个单一的函数被不同类型的查询调用。我知道,这很丑陋,但工作正常。 Tornado-MySQL 的类似但更简单的代码完全完美,但仅适用于 MySQL 5.7。
但是,似乎跳过了一些 UPDATE / INSERT 查询,我收到以下消息:
(1213, u'尝试获取锁时发现死锁;尝试重启事务')
WARNING:root:Connection 可能没有释放,使用时间 25.32s {'port': 3306, 'host': '127.0.0.1', 'user': '...', 'database': '.. .'} .
此外,有时服务器的不同客户端会看到不同版本的数据——比如他们与自己的未提交数据有不同的连接。
如何解决问题?
我想是关于池的问题——也许我必须关闭/重新创建它? TorMySQL 页面也有这一行:yield pool.close()
【问题讨论】: