2016-04-12 14 views
1

私は典型的なPyramid + SQLAlchemy + Postgresアプリケーションを持っています。ストレステストでまたは例外的負荷の瞬間にとPGで低max_connections設定で、OperationalExceptionが発生していることが起こるかもしれません:どのようにPyramid + SQLAlchemyで起こったOperationalErrorをキャッチする?

OperationalError: (psycopg2.OperationalError) FATAL: sorry, too many clients already 

を今、明らかに私はしたくないどこでもこの

try: 
    DBSession.query(Item)... 
except OperationalError as e: 
    log.error(...) 

"グローバルに"この例外をキャッチして適切に処理する方法はありますか?

私のアプリは、典型的なピラミッド状にZopeTransactionExtensionを使用しています。

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 
+1

http://docs.pylonsproject.org/projects/pyramid_exclog/en/latest/あなたのかゆみを傷つけたり、カスタム[tween](http://docs.pylonsproject.org/projects/pyramid/en /latest/narr/hooks.html#registering-tweens)。 –

答えて

0

私はこれを行うことができトゥイーン(例)を開発するために管理:

def catch_pg_exc_tween_factory(handler, registry): 
    def catch_pg_exc_tween_clos(request): 
     response = None 
     try: 
      response = handler(request) 
     except Exception as e: 
      log.error('\n\n\n +++ problem: %s', e) 
     return response 
    return catch_pg_exc_tween_clos 

奇妙なことは、その何もなく、明示的なトゥイーンではありませんdevelopment.iniで注文してください(over=またはunder=チューニングのconfig.add_tweenの呼び出しの量は働いたようです):

pyramid.tweens = pyramid_debugtoolbar.toolbar_tween_factory 
       pyramid.tweens.excview_tween_factory 
       pyramid_tm.tm_tween_factory 
       mypkg.util.tweens.catch_pg_exc_tween_factory 
関連する問題