为什么一些Django ORM查询会突然终止并显示“被杀死”?
有时候,当我们通过Python命令行或者Python脚本从数据库获取数据时,Python进程会突然停止,然后在终端上只显示一个字:Killed
就只有这一个字。这个问题只出现在某些脚本上,而且每次这些脚本运行时都会出现。特别是有一个查询需要花费比较长的时间来执行,还有一个南迁移(south migration)操作,它是逐行往数据库里添加很多数据。
我最开始的猜测是某个事务执行得太慢了,所以我给Postgres开启了自动提交功能,但问题依然没有解决。
我查看了Postgres的日志,里面只有这些内容:
2010-08-19 22:06:34 UTC LOG: could not receive data from client: Connection reset by peer
2010-08-19 22:06:34 UTC LOG: unexpected EOF on client connection
我试着在网上搜索,但你可以想象,一个只有一个字的错误信息很难找到相关的资料。
我使用的是Django 1.2和Postgres 8.4,运行在一台单独的Ubuntu 10.4的云服务器上,所有配置都是默认的。
2 个回答
0
如果你在使用psycopg这个库,问题可能出在数据库连接没有被关闭上。
根据psycopg的文档示例:
# Connect to an existing database
>>> conn = psycopg2.connect("dbname=test user=postgres")
# Open a cursor to perform database operations
>>> cur = conn.cursor()
# Close communication with the database
>>> cur.close()
>>> conn.close()
注意,如果你确实关闭了连接(使用dbcon.close()
或者直接删除连接对象),你可能还需要执行一次提交(commit)或者回滚(rollback),这取决于你的连接正在进行哪种类型的事务。
想了解更多细节,可以查看关闭连接的文档。
6
我能想到的唯一一个会自动结束Linux上进程的东西就是OOM杀手。系统日志里有什么内容呢?