【问题标题】:CherryPy Ping Database Connection Or Restart ConnectionCherryPy Ping 数据库连接或重启连接
【发布时间】:2016-05-01 19:20:28
【问题描述】:

我使用带有本地 MySQL 数据库的 CherryPy 网络服务器 (Python 2.7)。 简而言之,几天后,我在执行新的 SQL 查询时收到以下错误:

MySQL server has gone away 

虽然我可以找到这个问题的一些来源,但它们实际上与 CherryPy 无关。重新启动 CherryPy 可以解决问题。我猜,CherryPy 断开连接,无法重新连接?

因此,我的问题是:

  • 我如何检查数据库连接,如果它不活跃,重新连接?
  • 简单地说,如何避免上面提到的错误?

在下面,我展示了我正在使用的一些简化代码版本:

def dbconnect(thread_index):
    """
    Creates a database connection for each thread that CherryPy creates
    :param thread_index:
    """
    cherrypy.thread_data.db = MySQLdb.connect("localhost", "user",
                                          "password", "databasename")

class website(object):

    @cherrypy.expose
    def index(self):
        c = cherrypy.thread_data.db.cursor()
        c.execute("Select * from ATable")
        (output,) = c.fetchone()
        # generate some html output ...


cherrypy.engine.subscribe('start_thread', dbconnect)
website = website()
cherrypy.quickstart(website)

现在如果我在服务器上没有任何事情发生的几天后访问索引页面,索引方法会抛出 MySQL 服务器已消失 错误。

希望对于所有使用 CherryPy 并在某一天遇到 SQL 错误的人来说,这个问题可能会很有趣。 非常感谢:-)

【问题讨论】:

    标签: python mysql cherrypy


    【解决方案1】:

    CherryPy 保留一个线程池来服务客户端请求。 start_thread 在这些线程之一启动时被调用,并在创建线程时创建数据库连接。在处理了一些请求并处于空闲状态后,某些东西正在断开连接(可能是 mysql 客户端,或者服务器已断开连接(likely),甚至网络上的中间服务器终止了空闲连接)。只有当该线程上的下一个请求到达时才会引发错误。

    解决此问题的一种简单但可能效率不高的方法是在每个请求上打开一个新的数据库连接 - 将 dbconnect 绑定到 on_start_resource 或类似的。

    也许更好的是让start_thread 都设置连接,然后让on_start_resource 检查连接状态,如果未连接则重新连接。

    更好的是,我可能会做的是识别或创建一个对象来管理断开的连接,例如 MySQLReconnectDB,它与普通的 mysql.Connection 对象具有相同的接口,但在断开连接时会自动重新连接。 This answer 提出了一个可能的解决方案。然后,在您现有的 start_thread 处理程序中使用该实例。

    我知道这不是一个完整的答案,但我希望它为提出适合您的解决方案奠定基础。

    【讨论】:

    • 好的,我测试了一段时间的链接解决方案,现在一切正常。一个快速而肮脏的解决方案是捕获 MySQLdb.OperationalError 并再次调用 dbconnect 方法,以便当前线程重新启动数据库连接...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多