我刚刚对使用 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 和其他环境中使用什么样的方法来保护他们的数据库连接,我应该遵循什么样的最佳实践?