擅长:python、mysql、java
<p><strong><code>__del__</code>/<code>.close()</code>:</strong></p>
<ol>
<li><code>__del__</code>不能保证被调用</li>
<li>有些数据库在其<code>__del__</code>中不调用cursor.close()(错误做法,但正确)</li>
<li>有些数据库实际上并不在connection函数中创建连接,而是在cursor函数中创建连接(例如,对于2&3:pyhive的presto[可能他们已经修补了它])</li>
</ol>
<p><strong>一般在服务器连接上</strong></p>
<p>大多数服务器都有一个空闲超时配置属性(我们称之为T)。如果连接空闲时间超过T秒,服务器将删除该连接。大多数服务器还具有设置工作线程池(W)大小的属性。如果您已经有W个连接到服务器,则在尝试新连接时可能会挂起。再想象一下,您没有显式关闭连接的选项。在这种情况下,必须将超时设置为足够小,以使工作池永远不会完全使用,这是您有多少并发连接的函数。</p>
<p>但是,如果您确实关闭了游标/连接(即使不等同于上面的[3],它们的行为也类似),那么您不必管理这些服务器配置属性,您的线程池只需足够大,就可以管理所有并发连接(可以选择偶尔等待新资源)。我见过一些服务器(如卡桑德拉的Titan)无法从线程池中的工作人员不足中恢复,因此整个服务器会一直停机直到重新启动。</p>
<p><strong>TL/DR</strong>
如果您使用的是非常完善的库,比如<code>dano</code>提到的库,那么就不会有问题。如果您使用的是不太原始的库,那么如果您不调用<code>.close()</code>,则可能会在服务器上阻塞获取工作线程,这取决于您的服务器配置和访问率。</p>