Catatan 2021: Jawaban asli adalah dari 2010. Sekarang pendekatan yang lebih baik, seperti yang ditunjukkan dalam komentar, tampaknya menggunakan parameter pool_recycle .
Jawaban asli dari tahun 2010 berikut.
Lihat EDIT di bagian bawah untuk solusi yang diuji
Saya tidak mencobanya, tapi mungkin menggunakan Pendengar Kolam adalah cara untuk pergi?
Anda dapat melakukan sesuatu seperti ini:
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()])
Dengan cara ini setiap kali koneksi akan diperiksa dari kumpulan, kami menguji apakah itu benar-benar terhubung ke server. Jika tidak, kami memberi sqlalchemy satu kesempatan untuk terhubung kembali. Setelah itu, jika masalah masih ada, kita biarkan saja.
PS:Saya tidak menguji apakah ini berhasil.
Sunting:Untuk Pylons, modifikasi pada inisialisasi mesin yang ditunjukkan di atas perlu dilakukan di your_app.model.init_model (Pylons 0.9.7) atau your_app.config.environment.load_environment (Pylons 1.0) fungsi - ini adalah ini adalah tempat tempat instance engine dibuat.
EDIT
Oke. Saya dapat mereproduksi situasi yang dijelaskan. Kode di atas memerlukan beberapa perubahan agar dapat berfungsi. Di bawah ini adalah bagaimana hal itu harus dilakukan. Juga tidak masalah apakah itu 0.9.7 atau 1.0.
Anda perlu mengedit your_app/config/environment.py. Letakkan ekspor ini di atas file:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
Dan akhir dari fungsi load_environment akan terlihat seperti ini:
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)
Kali ini saya dapat mengujinya (pada Pylons 1.0 + SQLAlchemy 0.6.1) dan berhasil. :)