Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63937
  • 博文数量: 13
  • 博客积分: 458
  • 博客等级: 一等列兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-28 10:13
文章分类

全部博文(13)

文章存档

2012年(13)

分类: Python/Ruby

2012-03-13 11:08:22

今天上班时,突然发现测试环境登录时出错,查看gunicorn日志,显示“OperationalError: (OperationalError) (2006, 'MySQL server has gone away') 'SELECT 。。。”,其他含数据库操作的URL也是同样错误。
直接登录MySQL没有问题。重启gunicorn后登录正常。

从现象分析,应该是WEB服务器中的数据库连接不存在了,在Google上找到相应的答案。
首先,查看数据库的连接超时参数:
  1. mysql> show variables like '%timeout';
  2. +----------------------------+-------+
  3. | Variable_name | Value |
  4. +----------------------------+-------+
  5. | connect_timeout | 10 |
  6. | delayed_insert_timeout | 300 |
  7. | innodb_lock_wait_timeout | 50 |
  8. | innodb_rollback_on_timeout | OFF |
  9. | interactive_timeout | 28800 |
  10. | net_read_timeout | 30 |
  11. | net_write_timeout | 60 |
  12. | slave_net_timeout | 3600 |
  13. | table_lock_wait_timeout | 50 |
  14. | wait_timeout | 28800 |
  15. +----------------------------+-------+
interactove_timeout表示当没有数据库请求时,28800秒(即8小时)将自动断开连接。刚好昨晚到今天超过8小时了,应该就是这个问题了。但SQLAlchemy的连接池是如何管理连接的呢?
SQLAlchemy在创建engine时,有一个参数:pool_recycle表示多长时间重新进行数据库连接。默认-1表示不进行连接,因此只需要将该参数修改比mysql数据库的超时设置小即可,这里设置pool_recycle为7200(2小时)

在查看SQLAlchemy配置参数时还发现另外两个参数:
pool_size=5 连接数大小,默认为5,正式环境该数值太小,需根据实际情况调大
max_overflow=10 超出pool_size后可允许的最大连接数,默认为10
阅读(3329) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~