MySQL和python-mysql(mysqldb)在重负载下崩溃
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL和python-mysql(mysqldb)在重负载下崩溃相关的知识,希望对你有一定的参考价值。
我只是在最后整理一个使用web.py,MySQL和python-mysql(mysqldb模块)构建的网站,当我靠刷新按钮同时发送50个左右的消息时,对从sql注入等进行投射感到很好请求,它使我的服务器崩溃了!我重现了该错误,发现我可以交替获得以下两个错误,有时是一个,有时是另一个:
错误1:
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和其他环境中使用什么样的方法来保护他们的数据库连接,我应该遵循什么样的最佳实践?
答案
我不使用web.py
,但是文档和教程显示了另一种处理数据库的方式。
以上是关于MySQL和python-mysql(mysqldb)在重负载下崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何修复'MySQLConverter'对象对于库存输入python-mysql没有属性'_entry_to_mysql'?