保持mysql连接的正确方法

2024-06-12 13:10:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个24/7运行的应用程序,它使用mysql。它的不同功能使用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消失”的问题,但是它有太多的I/O

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


Tags: 实例方法self功能应用程序hostdbsettings
2条回答

在方法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 server has gone away”时,可以向任何类似于此的db处理程序函数添加decorator以重新连接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

一种方法是每次需要执行时都创建一个连接。您还可以创建一个函数来为您执行此操作。这就是它的本意。这不是太多的I/O。。

您还可以执行以下操作:

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

如果连接已断开,这将引发异常,会话将回滚,它将重试,很可能成功。(第一个解决方案要好得多)

相关问题 更多 >