2016-09-25 5 views
0

私はです。SQLAlchemy CORE 1.0.9ピラミッドフレームワーク1.7です。私は次のエラーを取得を開始アプリを使用して、数時間後SQLAlchemyのコア+ピラミッドがコネクションを閉じていない

# file __ini__.py 
from .factories import root_factory 
from pyramid.config import Configurator 
from sqlalchemy import engine_from_config 


def main(global_config, **settings): 
    """ This function returns a Pyramid WSGI application.""" 

    config = Configurator(settings=settings, root_factory=root_factory) 
    engine = engine_from_config(settings, prefix='sqlalchemy.') 

    # Retrieves database connection 
    def get_db(request): 
     connection = engine.connect() 
     def disconnect(request): 
      connection.close() 
     request.add_finished_callback(disconnect) 
     return connection 

    config.add_request_method(get_db, 'db', reify=True) 
    config.scan() 
    return config.make_wsgi_app() 

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: remaining connection slots are reserved for non-replication superuser connections 

どうやら私が到達していると私は、データベース9.4のpostgresに接続するため、次の構成を使用しています接続の最大数。それはconnections.close()のように本当に接続を閉じていない、ちょうどプールへの接続を返します。 NullPoolを使用してプーリングを無効にできますが、おそらくパフォーマンスに大きな影響を与えます。

誰かが正しく設定する方法を知っていますか?SQLAlchemy Core良いパフォーマンスを得て接続を適切に閉じるには?

pyramid tutorialsへのリンクを控えてください。私はで、SQLAlchemy ORMセットアップに興味はありません。 のみSQLAlchemyコアしてください。

+0

Zope Transaction Manager(pyramid_tm)を使うべきだと思います。これはピラミッドアプリのラッパーで、リクエスト処理と統合されています。要求が無事に完了すると、トランザクションは自動的にコミットされます。あるいは、例外が発生した場合、トランザクションを中止します。 [詳細情報](http://pyramid-sqlalchemy.readthedocs.io/en/latest/transactions.html) – webjunkie

+0

FWIW私はあなたのサンプルコードに間違ったことはありません。 ORMは物事が本当に削除されることを保証するために 'Session.remove'を持っていますが、SQLAコアを使うと、' .close'が動作するはずです。 –

答えて

0

実際には、以前の設定ではすべて問題ありませんでした。この問題は、セロリの労働者が接続を閉鎖していないことが原因です。

関連する問題