Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Xử lý khởi động lại mysql trong SQLAlchemy

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Workbench - Cách đồng bộ hóa Sơ đồ EER

  2. Giải thích về khung tính khả dụng cao của MySQL - Phần III:Tình huống thất bại

  3. ứng dụng kết nối với cơ sở dữ liệu

  4. Mysql cách tham gia các bảng

  5. Tại sao MySQL không sử dụng các chỉ mục tối ưu