Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Tangani restart mysql di SQLAlchemy

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. :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pencarian tidak sensitif diakritik MySQL (Arab)

  2. menghindari injeksi MySQL dengan kelas Zend_Db

  3. Apa operator <=> ini di MySQL?

  4. INSERT IGNORE vs INSERT ... PADA PEMBARUAN KUNCI DUPLICATE

  5. Apakah lebih baik mengembalikan satu kueri besar atau beberapa kueri yang lebih kecil?