CherryPy Ping数据库连接或重新启动连接

时间:2016-05-01 19:20:29

标签: python mysql cherrypy

我使用带有本地MySQL数据库的CherryPy webserver(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错误的人都很有趣。 非常感谢你: - )

1 个答案:

答案 0 :(得分:2)

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

解决此问题的一种简单但可能无效的方法是在每个请求上打开一个新的数据库连接 - 在dbconnect或类似情况下绑定on_start_resource

或许更好的方法是让start_thread设置连接,然后让on_start_resource检查连接状态,如果没有连接则重新连接。< / p>

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

我意识到这不是一个完整的答案,但我希望它为提供适合您的解决方案奠定了基础。