我有一个通过 sqlalchemy 与 Postgres 通信的守护进程。该守护进程执行以下操作:
while True:
oEngine = setup_new_engine()
with oEngine.connect() as conn:
Logger.debug("connection established")
DBSession = sessionmaker(bind=conn)()
Logger.debug('DBSession created. id={0}'.format(id(DBSession)))
#do a bunch of stuff with DBSession
DBSession.commit()
Logger.debug('DBSession committed. id={0}'.format(id(DBSession)))
在无限循环的第一次迭代中,一切运行良好。暂时而言,DBSession
成功地向数据库发出了几个查询。但是随后一个查询失败并出现以下错误:
OperationalError: (OperationalError) SSL SYSCALL error: Bad file descriptor
这对我来说意味着一个关闭的连接或文件描述符被使用。但是,连接是由守护进程创建和维护的,因此我不知道这意味着什么。
换句话说,发生的情况是:
create engine
open connection
setup dbsession
query dbsession => works great
query dbsession => ERROR
该查询看起来像这样:
DBSession.query(Login)
.filter(Login.LFTime == oLineTime)
.filter(Login.success == self.success)
.count()
我认为这似乎是完全合理的。
我的问题是:这种行为可能有哪些原因,如何修复或隔离问题?
如果需要更多代码,请告诉我。代码量很大,所以我在这里采取了极简主义方法...