1

我刚刚对使用 web.py、MySQL 和 python-mysql(mysqldb 模块)构建的网站进行最后润色,当我靠在刷新按钮上同时发送 50 个左右的请求和它使我的服务器崩溃了!我重现了该错误,发现以下两个错误可以互换,有时是一个,有时是另一个:

错误一:

127.0.0.1:60712 - - [12/Sep/2013 09:54:34] "HTTP/1.1 GET /" - 500 Internal Server Error
Exception _mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now") in <bound method Cursor.__del__ of <MySQLdb.cursors.Cursor object at 0x10b287750>> ignored
Traceback (most recent call last):

错误2:

python(74828,0x10b625000) malloc: *** error for object 0x7fd8991b6e00: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

显然,这些请求使 MySQL 紧张并导致它崩溃,所以我的问题是如何防止这种情况发生。

我的服务器设置是使用 Ubuntu 13.04、nginx、MySQL(我使用 mysqldb python 模块连接到的)、web.py 和 fast-cgi 设置的。

当 web.py 应用程序启动时,它连接到数据库,如下所示:

def connect():
    global con 
    con = mdb.connect(host=HOST, user=USER, passwd=PASSWORD, db=DATABASE)

    if con is None:
        print  'error connecting to database'

并且 con 对象被分配给一个全局变量,因此应用程序的各个部分都可以访问它

我像这样访问数据库数据:

def get_page(name):
    global con 
    with con:
        cur = con.cursor()    
        cur.execute("SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA`='jt_website' AND `TABLE_NAME`='pages'")
        table_info = cur.fetchall()

我的一个想法是在每次请求之前和之后打开和关闭数据库,但这对我来说似乎有点过头了,有人对此有什么意见吗?

人们在 python 和其他环境中使用什么样的方法来保护他们的数据库连接,我应该遵循什么样的最佳实践?

4

1 回答 1

0

我不使用web.py,但文档和教程显示了处理数据库的不同方式。

他们建议使用一个全局对象(您在 中创建它).connect,这可能是一种风格。global proxyFlask

试着这个例子←DEAD LINK那样组织你的代码,看看它是否会再次发生。

您报告的错误似乎是并发问题,通常由框架自动处理。

关于后一个问题:

人们使用什么样的方法来保护他们在 python 和其他环境中的数据库连接,我应该遵循什么样的最佳实践?

根据您使用的 Web 框架,它会有所不同。例如,Django 隐藏了所有内容,并且可以正常工作。 Flask让你选择你想做的事情。您可以使用flask-sqlalchemy非常好的SQLAlchemy ORM 来管理 Web 应用程序的连接代理。

于 2013-09-12T09:33:10.903 回答