MySQL和python-mysql(mysqldb)在重负载下崩溃

时间:2013-09-12 09:10:57

标签: python mysql nginx fastcgi mysql-python

我刚刚对使用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和其他环境中的数据库连接以及我应该遵循哪种最佳实践?

1 个答案:

答案 0 :(得分:0)

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

他们建议使用全局对象(您在.connect中创建),该对象可能是global proxy样式中的Flask

尝试按this example中的方式组织代码,看看是否再次发生。

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

关于后一个问题:

  

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

根据您使用的Web框架而不同。例如,Django隐藏了一切,它只是起作用。 Flask可让您选择要执行的操作。您可以使用flask-sqlalchemy使用非常好的SQLAlchemy ORM来管理Web应用程序的连接代理。