gpt4 book ai didi

Python SQLAlchemy - "MySQL server has gone away"

转载 作者:太空狗 更新时间:2023-10-29 21:29:18 26 4
gpt4 key购买 nike

让我们看看下一个片段 -

@event.listens_for(Pool, "checkout")
def check_connection(dbapi_con, con_record, con_proxy):

cursor = dbapi_con.cursor()
try:
cursor.execute("SELECT 1") # could also be dbapi_con.ping(),
# not sure what is better
except exc.OperationalError, ex:
if ex.args[0] in (2006, # MySQL server has gone away
2013, # Lost connection to MySQL server during query
2055): # Lost connection to MySQL server at '%s', system error: %d
# caught by pool, which will retry with a new connection
raise exc.DisconnectionError()
else:
raise


engine = create_engine('mysql://user:puss123@10.0.51.5/dbname', pool_recycle = 3600,pool_size=10, listeners=[check_connection])

session_factory = sessionmaker(bind = engine, autoflush=True, autocommit=False)
db_session = session_factory()

...
some code that may take several hours to run
...

db_session.execute('SELECT * FROM ' + P_TABLE + " WHERE id = '%s'" % id)

我以为在checkout事件下注册checkout_connection函数就可以解决,但是没有现在的问题是我应该如何告诉 SQLAlchemy 处理连接丢失,所以每次我调用 execute() 时它都会检查连接是否可用,如果不可用它会再次启动它?

----更新----

SQLAlchemy的版本是0.7.4

----更新----

def checkout_listener(dbapi_con, con_record, con_proxy):
try:
try:
dbapi_con.ping(False)
except TypeError:
dbapi_con.ping()
except dbapi_con.OperationalError as exc:
if exc.args[0] in (2006, 2013, 2014, 2045, 2055):
raise DisconnectionError()
else:
raise


engine = create_engine(CONNECTION_URI, pool_recycle = 3600,pool_size=10)
event.listen(engine, 'checkout', checkout_listener)
session_factory = sessionmaker(bind = engine, autoflush=True, autocommit=False)
db_session = session_factory()

session_factory 被发送到每个新创建的线程

class IncidentProcessor(threading.Thread):

def __init__(self, queue, session_factory):
if not isinstance(queue, Queue.Queue):
raise TypeError, "first argument should be of %s" (type(Queue.Queue))
self.queue = queue
self.db_session = scoped_session(session_factory)
threading.Thread.__init__(self)

def run(self):

self.db_session().execute('SELECT * FROM ...')

...
some code that takes alot of time
...

self.db_session().execute('SELECT * FROM ...')

现在,当执行在很长一段时间后运行时,我收到“MySQL 服务器已消失”错误

最佳答案

有人讨论过这个问题,这个文档很好地描述了这个问题,所以我使用他们推荐的方法来处理此类错误:http://discorporate.us/jek/talks/SQLAlchemy-EuroPython2010.pdf

看起来像这样:

from sqlalchemy import create_engine, event
from sqlalchemy.exc import DisconnectionError


def checkout_listener(dbapi_con, con_record, con_proxy):
try:
try:
dbapi_con.ping(False)
except TypeError:
dbapi_con.ping()
except dbapi_con.OperationalError as exc:
if exc.args[0] in (2006, 2013, 2014, 2045, 2055):
raise DisconnectionError()
else:
raise


db_engine = create_engine(DATABASE_CONNECTION_INFO,
pool_size=100,
pool_recycle=3600)
event.listen(db_engine, 'checkout', checkout_listener)

关于Python SQLAlchemy - "MySQL server has gone away",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18054224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com