Ghi chú năm 2021: Câu trả lời ban đầu là từ năm 2010. Bây giờ, cách tiếp cận tốt hơn, như đã chỉ ra trong các nhận xét, dường như là sử dụng pool_recycle param .
Câu trả lời gốc từ năm 2010 sau đây.
Xem CHỈNH SỬA ở dưới cùng để biết giải pháp đã thử nghiệm
Tôi chưa thử nhưng có thể sử dụng PoolListener là một cách để đi?
Bạn có thể làm điều gì đó như sau:
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 khi kết nối sắp được kiểm tra từ nhóm, chúng tôi sẽ kiểm tra xem nó có thực sự được kết nối với máy chủ hay không. Nếu không, chúng tôi cho sqlalchemy một cơ hội để kết nối lại. Sau đó, nếu vấn đề vẫn còn, chúng tôi sẽ giải quyết.
Tái bút:Tôi đã không kiểm tra xem điều này có hiệu quả không.
Chỉnh sửa:Đối với Giá treo, các sửa đổi đối với việc khởi tạo động cơ được hiển thị ở trên sẽ cần được thực hiện trong your_app.model.init_model (Giá treo 0.9.7) hoặc your_app.config.enosystem.load_enosystem (Pylons 1.0) function - đây là đây là địa điểm nơi tạo phiên bản động cơ.
CHỈNH SỬA
Được. 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 nó nên được thực hiện. Ngoài ra, không quan trọng là 0,9,7 hay 1,0.
Bạn cần chỉnh sửa your_app / config / environment.py. Đặt các bản xuất này ở đầu tệp:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
Và phần cuối của hàm load_enosystem sẽ có dạng như sau:
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)
Lần này tôi đã có thể kiểm tra nó (trên Pylons 1.0 + SQLAlchemy 0.6.1) và nó hoạt động. :)