3

我有一个使用 mysql 运行 24/7 的应用程序。它的不同功能使用mysql。实现它的一种方法是在应用程序中创建一个全局 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,防止应用程序一遍又一遍地创建和删除连接,但如果它保持理想状态,它将面临“mysql 消失”问题。方法2,“mysql away”没有问题,但它有太多的I/O。

我很确定这些方法都不是正确的,但是正确的方法是什么?

4

2 回答 2

1

一种方法是在每次需要执行时创建一个连接。你也可以创建一个函数来为你做这件事。这就是它的本意。这不是太多的I / O..

您还可以执行以下操作:

while True:
    try:
        db_session.execute('SELECT * FROM table')
        break
    except SQLAlchemyError:
        db_session.rollback()

如果连接已经消失,这将引发异常,会话将被回滚,它会再次尝试可能会成功。(第一个解决方案要好得多)

于 2013-10-18T01:31:36.247 回答
0

在方法 1 中,根据应用场景 'MySQL server has gone away' 可能会发生,因为

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

您可以将装饰器添加到像这样的任何数据库处理程序函数中,以在引发异常“MySQL 服务器已消失”时重新连接 MySQL 数据库。

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 回答