Xem EDIT ở dưới cùng cho giải pháp thử nghiệm
Tôi không thử nó, nhưng có lẽ sử dụng PoolListener là một con đường để đi?
Bạn có thể làm một cái gì đó như thế này:
class MyListener(sqlalchemy.interfaces.PoolListener):
def __init__(self):
self.retried = False
def checkout(self, dbapi_con, con_record, con_proxy):
try:
dbapi_con.info() # is there any better way to simply check if connection to mysql is alive?
except sqlalchemy.exc.OperationalError:
if self.retried:
self.retried = False
raise # we do nothing
self.retried = True
raise sqlalchemy.exc.DisconnectionError
# next, code according to documentation linked above follows
e = create_engine("url://", listeners=[MyListener()])
Bằng cách này mỗi kết nối thời gian sắp được kiểm tra ra từ hồ bơi chúng tôi kiểm tra nếu nó thực sự kết nối với máy chủ. Nếu không, chúng tôi cung cấp cho sqlalchemy một cơ hội để kết nối lại. Sau đó, nếu vấn đề vẫn còn đó, chúng ta hãy để nó đi.
PS: Tôi đã không kiểm tra xem công trình này có hoạt động hay không.
Edit: Đối với các giá treo, việc sửa đổi các khởi động trình bày ở trên sẽ cần phải được thực hiện trong
your_app.model.init_model (giá treo 0.9.7) hoặc
your_app.config.environment.load_environment
(giá treo 1.0) Chức năng
-
đây là
đây là địa điểm
nơi
nơi phiên bản động cơ được tạo.
EDIT
Ok. Tôi đã có thể tái tạo tình huống được mô tả. Đoạn mã trên cần một số thay đổi để hoạt động. Dưới đây là cách thực hiện. Ngoài ra nó không quan trọng cho dù đó là 0.9.7 hoặc 1.0.
Bạn cần chỉnh sửa your_app/config/environment.py. Đặt những xuất khẩu ở phía trên của tập tin:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
Và cuối chức năng load_environment nên xem xét như thế:
class MyListener(sqlalchemy.interfaces.PoolListener):
def __init__(self):
self.retried = False
def checkout(self, dbapi_con, con_record, con_proxy):
try:
dbapi_con.cursor().execute('select now()')
except _mysql_exceptions.OperationalError:
if self.retried:
self.retried = False
raise
self.retried = True
raise sqlalchemy.exc.DisconnectionError
config['sqlalchemy.listeners'] = [MyListener()]
engine = engine_from_config(config, 'sqlalchemy.')
init_model(engine)
thời gian này tôi đã có thể kiểm tra nó (trên giá treo 1.0 + SQLAlchemy 0.6. 1) và hoạt động. :)
Cảm ơn, linh hồn tương tự là ở đây: http://www.mail-archive.com/[email protected]/msg15079.html và nó hoạt động cho tôi. – wRAR
Không thấy chỉnh sửa của bạn :) – wRAR
Lưu ý đối với SQLAlchemy 0.7 - 'PoolListener' không được dùng nữa, nhưng giải pháp tương tự có thể được triển khai bằng [hệ thống sự kiện] mới (http://docs.sqlalchemy.org/en/latest/ core/pooling.html # disconnect-handling-bi quan). –