免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3380 | 回复: 10
打印 上一主题 下一主题

python程序运行1天报无法连接 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-19 11:05 |只看该作者 |倒序浏览
本帖最后由 andyhua12 于 2013-04-19 11:07 编辑

我用tornado+ORM+python写的程序,数据库是mysql.

程序调试的时候一切正常,大概运行一天左右后报错,无法连接,重启后ok,然后循环。

看报错应该和数据库有关,请各位大虾看看,或者给点提示?



具体实现方式如下:


# 建立数据库引擎
engine = create_engine('mysql://dbname:passwd@XX.XX.XX.XX/DB', echo=True, encoding="utf-8",pool_recycle=300, pool_size=20, pool_timeout=5, convert_unicode=True)
#初始化Base类,所有ORM类都将继承自Base类
Base = declarative_base()

#把Base类bind到数据库连接上
Base.metadata.bind=engine

#创建session
DBsession = scoped_session(sessionmaker(bind=engine))

#定义ORM类的query方法,可以不做,只是为了方便
Base.query = DBsession.query_property()

# Data Define

报错截图:

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2013-04-19 11:10 |只看该作者
回复 1# andyhua12


    mysql 数据库好象 确省 8小时 没操作,就断了,需要设置。我以前碰到过

    把连接数据库 时候 出错的 英文信息, copy到bing 里搜索,就能搜到结果

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
3 [报告]
发表于 2013-04-19 11:43 |只看该作者
看server端的设置吧。

论坛徽章:
0
4 [报告]
发表于 2013-04-19 11:57 |只看该作者
2013-04-02 17:09:59,353 INFO sqlalchemy.engine.base.Engine.0x...4990 ['A']
INFO:sqlalchemy.engine.base.Engine.0x...4990:['A']
ERROR:root:Uncaught exception, closing connection.
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/tornado-2.4.1-py2.6.egg/tornado/iostream.py", line 311, in wrapper
    callback(*args)

我们可以看到这个日志,17:09操作的时候完成正常,第二天访问就报错,ERROR:root:Uncaught exception, closing connection.

论坛徽章:
0
5 [报告]
发表于 2013-04-19 12:28 |只看该作者
错误信息说有没有捕获的异常,那你要去看看是执行到哪里出现这个异常,异常的返回信息是什么,最好把你的代码包在一个大的try...except中,例如:
try:  
  #{此处放你的代码}
except:  #全面的异常捕获,将异常写到c盘的log.txt中:
    f=open(r"c:\log.txt",'a')  
    traceback.print_exc(file=f)  
    f.flush()  
    f.close()

这样等到出异常的时候,打开log.txt就知道了,执行到哪里出错,出的是什么错误。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2013-04-19 12:39 |只看该作者
回复 1# andyhua12


    http://blog.csdn.net/sunguangran/article/details/6303947

好象这儿就是说的这个问题

论坛徽章:
0
7 [报告]
发表于 2013-04-19 13:36 |只看该作者
本帖最后由 andyhua12 于 2013-04-19 13:49 编辑

回复 5# ts32767

你问的这个问题也是我很头疼的,很难定位执行到什么地方会出现异常。

一直用的话没出现过异常,就会过一天再出现,不管执行到哪,第二天就报错,需要重启。

不过,我先试试你的办法。


   

论坛徽章:
0
8 [报告]
发表于 2013-04-19 14:44 |只看该作者
回复 7# andyhua12

根据你的描述,如果不是程序内部原因原因的异常(比如每次异常都在不同的代码行位置),那么极有可能是外部事件或者工作条件出错导致的异常,这个有不可预见性,比较像上面的大师说的mysql连接超时(长时间没有操作)。你不妨在代码中加个idle thread,经常性的做一些读操作(比如跟数据库之间读写心跳消息)。或者干脆用短连接,自己在数据库连接的地方加个空闲的时候超时重新连接的机制。


   

论坛徽章:
0
9 [报告]
发表于 2013-04-19 15:29 |只看该作者
回复 6# goldenfort

应该不是这个原因,如果是这个原因应该有报错,如:MySQL server has gone away。

而且我设置了pool_recycle=600   10分钟,小于8小时,所以不会是这个原因。

当8小时以后 现有的连接没有活动,则MySql会自动断开。因此再次访问时会抛出错误。uliorm 使用SQLAlchemy的缺省的连接方式,会自动使用连接池。默认是5个连接。它有一个pool_recycle 的参数,用于设置回收连接的时间。这样,只要你设置一个小于MySql断开的超时时间就 可以了。

   

论坛徽章:
0
10 [报告]
发表于 2013-04-28 14:16 |只看该作者
讲述一下进展,我打开连接回收的日志,果然报出了MySQL server has gone away。

通过配置my.cnf暂时解决,但我希望从代码解决,谁有好的办法吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP