擅长:python、mysql、java
<p>我不知道postgresql本身有任何这样的“隐藏”超时。PostgreSQL确实有<code>statement_timeout</code>,但是如果你点击了,你应该在服务器日志中得到一个<code>ERROR: canceling statement due to statement timeout</code>(它也会记录被取消的语句)。我不能代表psycopg2说话。一定要检查服务器日志中的任何相关信息。在</p>
<p>可能是网络问题?长时间运行的语句将是一个长时间处于空闲状态的TCP连接。也许你的端口转发会清除空闲超过30分钟的连接?也许你的TCP连接没有使用keepalive。Postgresql有一些用于调整TCP keepalive的设置(TCP_keepalives_interval等),您可能还需要进行一些内核/网络配置,以确保它们实际上已启用。在</p>
<p>例如,我刚试着在这里连接到我自己的机器,<code>tcp_keepalives_interval</code>默认值为7200,即2小时。如果你的端口转发在30分钟后被切断,这个默认值就不行了。您可以覆盖客户机连接字符串中使用的设置(假设您可以直接旋转conninfo字符串),或者在用户/数据库属性中设置GUC变量,或者postgresql.conf一</p>
<p>参见:</p>
<ul>
<li><a href="http://www.postgresql.org/docs/9.0/static/runtime-config-connection.html" rel="noreferrer">http://www.postgresql.org/docs/9.0/static/runtime-config-connection.html</a>-服务器设置</li>
<li><a href="http://www.postgresql.org/docs/9.0/static/libpq-connect.html" rel="noreferrer">http://www.postgresql.org/docs/9.0/static/libpq-connect.html</a>-客户端连接字符串设置</li>
</ul>