3

mysql を使用するアプリケーションを 24 時間年中無休で実行しています。それのさまざまな機能はmysqlを使用します。これを実装する 1 つの方法は、次のようにアプリケーションでグローバル mysql インスタンスを作成することです。

self.db = MySQLdb.connect(
            host=self.settings.MYSQL_HOST_LOCAL,
            user=self.settings.MYSQL_USER,
            passwd=self.settings.MYSQL_PASS,
            db=self.settings.MYSQL_DB,
            use_unicode=True,
            charset="utf8",
        )

を使用してコマンドを実行しますself.db.execute(...)。これにより、アプリケーションは 1 つの接続を使用します。もう 1 つの方法は、トランザクションを実行する必要があるたびに接続を作成することです。

アプローチ 1 は、アプリケーションが接続を何度も作成および削除することを防ぎますが、理想的なままであると、「mysql が消えてしまう」という問題に直面します。アプローチ 2、「mysql がなくなった」という問題はありませんが、I/O が多すぎます。

これらのアプローチはどちらも正しいものではないと確信していますが、正しいアプローチは何ですか?

4

2 に答える 2

0

アプローチ 1 では、アプリケーション シナリオによると、「MySQL サーバーがなくなった」が発生する可能性があります。

You have encountered a timeout on the server side and the automatic reconnection in the client is disabled (the reconnect flag in the MYSQL structure is equal to 0).

このような任意の db ハンドラ関数にデコレータを追加して、例外 'MySQL server has gone away' が発生したときに MySQL db を再接続できます。

class DB:
    """Database interface"""

    def retry(func):
        def call(self, *args, **kwargs):
            lock.acquire()
            try:
                return func(self, *args, **kwargs)
            except MySQLdb.Error, e:
                if 'MySQL server has gone away' in str(e):
                    # reconnect MySQL
                    self.connect_mysql()
                else:
                    # No need to retry for other reasons
                    pass
            finally:
                lock.release()
        return call

    def __init__(self):
        pass

    def connect_mysql(self):
        # do connection

    @retry
    def db_handler_function(self):
        # do something
于 2013-10-18T01:52:27.067 に答える