保持mysql连接的正确方法

时间:2013-10-18 01:22:18

标签: python mysql

我有一个运行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.

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

2 个答案:

答案 0 :(得分:1)

一种方法是在每次需要执行时创建连接。您还可以创建一个功能来为您完成。这就是它的意思。它不是太多I / O ..

您还可以执行以下操作:

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

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

答案 1 :(得分: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).

您可以向任何数据库处理程序函数添加装饰器,以便在异常“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