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)在重负载下崩溃的主要内容,如果未能解决你的问题,请参考以下文章

python-mysql

python-mysql,socket

Python-mysql练习

python-mysql驱动64位

如何修复'MySQLConverter'对象对于库存输入python-mysql没有属性'_entry_to_mysql'?

Python-mysql:何时显式回滚事务