这与sqlalchemy
和pg8000
相关。
我到处都读过我应该关闭ResultProxy
对象,以便可以将连接返回到池中。
本地测试数据库允许最多100
个连接:
$ psql -h 127.0.0.1 -U postgres
Password for user postgres:
psql (9.5.5, server 9.6.0)
WARNING: psql major version 9.5, server major version 9.6.
Some psql features might not work.
Type "help" for help.
postgres=# show max_connections;
max_connections
-----------------
100
(1 row)
以下测试脚本在每个循环中创建一个引擎,不会读取或关闭ResultProxy
对象。它真的很糟糕。
奇怪的是,它也不会产生too many connections
类错误。这对我来说真的很困惑。 sqlalchemy是否表现出一些魔力?或者postgres
可能真的是魔术?
#!/usr/bin/env python2.7
from __future__ import print_function
import sqlalchemy
def handle():
url = 'postgresql+pg8000://{}:{}@{}:{}/{}'
url = url.format("postgres", "pass", "127.0.0.1", "5432", "usercity")
conn = sqlalchemy.create_engine(url, client_encoding='utf8')
meta = sqlalchemy.MetaData(bind=conn, reflect=True)
table = meta.tables['events']
clause = table.select()
result = conn.execute(clause)
if __name__=='__main__':
for i in range(2000):
print(i)
handle()
答案 0 :(得分:3)
没有魔法,只是垃圾收集。由于handle()
没有返回任何内容(或修改全局数据),因此无法对其创建的连接或游标的引用超出handle()
的范围。当它们超出范围时,它们的引用计数降至0,并且它们被删除(没有确定何时发生这种情况,但实际上,在CPython中这会立即发生)。