2017-01-07 4 views
0

Это связано с sqlalchemy и pg8000.Как достичь максимального уровня соединения с sqlalchemy?

Я читал везде, что должен закрыть объект 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() 

ответ

3

Никакой магии, просто сбор мусора. Поскольку handle() ничего не возвращает (или не изменяет глобальные данные), нет ссылки на соединение или курсор, который он создает, чтобы жить за пределами handle(). Когда они выходят из сферы действия, их количество ссылок уменьшается до 0, и они удаляются (нет надежной гарантии того, когда это произойдет, но на практике в CPython это происходит немедленно).

+0

спасибо, что делает полный смысл. Протестировано и проверено. – lingxiao

Смежные вопросы