psycopg2.errors.IdleInTransactionSessionTimeout:由于空闲事务超时而终止连接

Rya*_*der 6 postgresql sqlalchemy

我有下一个错误日志

     ERROR - 2020-04-22 09:32:38,508 - sqlalchemy.pool.impl.QueuePool: Exception during reset or similar
     Traceback (most recent call last):
       File "/usr/local/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 693, in _finalize_fairy
         fairy._reset(pool)
       File "/usr/local/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 880, in _reset
         pool._dialect.do_rollback(self)
       File "/usr/local/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 538, in do_rollback
         dbapi_connection.rollback()
     psycopg2.errors.IdleInTransactionSessionTimeout: terminating connection due to idle-in-transaction timeout
     SSL connection has been closed unexpectedly
Run Code Online (Sandbox Code Playgroud)

对原因以及如何解决有什么想法吗?

pif*_*for 5

根本原因是您的数据库会话已使用 BEGIN 启动事务,但不活动的时间长于 PostgreSQL 参数idle_in_transaction_session_timeout(在 PG 实例级别定义):

  idle_in_transaction_session_timeout (integer)

   Terminate any session with an open transaction that has been idle for longer than the specified duration in milliseconds. This allows
   any locks held by that session to be released and the connection slot
   to be reused; it also allows tuples visible only to this transaction
   to be vacuumed. See Section 24.1 for more details about this.

   The default value of 0 disables this feature.
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您需要修复应用程序代码以防止空闲事务过长,或者修改 PG 参数idle_in_transaction_session_timeout。


Rya*_*der 2

我的情况是,我的会议没有正确关闭。

我已经用类似的结构重写了所有代码

    session = init_session()
    try:
        ... # business logic with other calls and raise-s
        session.commit() # optional
    finally:
        session.close() 
Run Code Online (Sandbox Code Playgroud)

然后问题就消失了