为什么一些Django ORM查询会突然终止并显示“被杀死”?

7 投票
2 回答
2256 浏览
提问于 2025-04-16 03:03

有时候,当我们通过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杀手。系统日志里有什么内容呢?

撰写回答