2

Pyramidアプリケーションに非常に大きな問題があることを発見しました。mongoスキャフォールドは、データベース接続の処理にもイベントハンドラーを使用する必要があることを示しています。アイデアは、新しいリクエストが着信したときにデータベースに接続し、ページが切断されたときに接続することです。だからこれは私がしたことです__init.py__

def connectDatabase(event):
    mongo = MongoDB()
    con = mongo.connectDatabase()
    db = con[Cfg_MongoDB_Database]
    event.request.con = con
    event.request.db = db
    redis = Redis()
    con = redis.connectDatabase()
    event.request.redis = con
    log.debug('newrequest')

def closeConnection(event):
    mongo = MongoDB()
    mongo.closeConnection(event.request.con) 
    log.debug('newresponse')   

def main(global_config, **settings):
    config = Configurator(settings=settings, root_factory=Dashboard)
    authentication = AuthTktAuthenticationPolicy(Cfg_Auth_Key, hashalg='sha512',\
        include_ip=False, timeout=3600*24*7, max_age=3600*24*7, reissue_time=3600)
    authorization = ACLAuthorizationPolicy()
    config.set_authentication_policy(authentication)
    config.set_authorization_policy(authorization)
    config.add_static_view('includes', 'includes', cache_max_age=3600)
    config.add_renderer(".html", "pyramid.mako_templating.renderer_factory")  
    config.add_route('dash', '/')
    config.add_subscriber(connectDatabase, NewRequest)
    config.add_subscriber(closeConnection, NewResponse)
    log.debug('main')
    config.scan()
    return config.make_wsgi_app()

ただし、データベースに接続しているメソッドにロガーを配置し、メソッドが10回以上呼び出されていること、および100回以上キャッシュを無効にした場合にそのメソッドが呼び出されていることを発見しましたadd_static_view。これは、css、image、jsごとに、新しい接続が確立されることを意味します。これは大きなオーバーヘッドです!!! サイトはデータベースに100回接続するのに300msかかります!

/Users/jan/Documents/Test2/test2/data.py changed; reloading...
-------------------- Restarting --------------------
2013-02-01 18:32:48,351 DEBUG [test2.tools][MainThread] main
Starting server in PID 12374.
serving on http://127.0.0.1:6543
2013-02-01 18:34:14,451 DEBUG [test2.tools][Dummy-2] newrequest
2013-02-01 18:34:14,582 DEBUG [test2.tools][Dummy-2] newresponse
2013-02-01 18:34:14,952 DEBUG [test2.tools][Dummy-3] newrequest
2013-02-01 18:34:14,953 DEBUG [test2.tools][Dummy-3] newresponse
2013-02-01 18:34:17,459 DEBUG [test2.tools][Dummy-4] newrequest
2013-02-01 18:34:17,474 DEBUG [test2.tools][Dummy-4] newresponse
2013-02-01 18:34:17,482 DEBUG [test2.tools][Dummy-5] newrequest
2013-02-01 18:34:17,497 DEBUG [test2.tools][Dummy-5] newresponse
2013-02-01 18:34:19,158 DEBUG [test2.tools][Dummy-2] newrequest
2013-02-01 18:34:19,159 DEBUG [test2.tools][Dummy-2] newresponse

したがって、これまでの解決策は、代わりに接続をモデルに移動することです。しかし、いつ接続を閉じることができるかよりも、どうすればわかりますか?誰かが私の問題に対してより良い、よりエレガントな解決策を持っていますか?

4

2 に答える 2

3

Pyramidでこれを行うための推奨される方法は、NewRequestイベントではなくリクエストプロパティを使用することです。お気づきのとおり、そのイベントは、静的なリクエストを含むすべてのリクエストに対して発生します。リクエストのプロパティは遅延しており、必要な場合にのみ評価されます。リクエストの存続期間中、キャッシュ(再定義)するように指定できます。を追加する方法を示す以下の例をリンクしましたrequest.db

https://raw.github.com/Pylons/pyramid_cookbook/master/database/mongodb.rst

以下はあなたのために働くはずのいくつかの更新されたコードです。

def main(global_config, **settings):
    # ...

    db_url = urlparse(settings['mongo_uri'])
    config.registry.db = pymongo.Connection(
        host=db_url.hostname,
        port=db_url.port,
    )

    def add_db(request):
        db = config.registry.db[db_url.path[1:]]
        if db_url.username and db_url.password:
            db.authenticate(db_url.username, db_url.password)
        return db

    config.add_request_method(add_db, 'db', reify=True)
于 2013-02-02T08:37:59.457 に答える
3

pymongoには接続プールが組み込まれていますhttp://api.mongodb.org/python/current/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient

接続プールを使用しても、リクエストごとに新しい接続が作成されるわけではありません

また、まさにこの理由から、ピラミッドアプリが本番環境で静的メディアを提供する必要はないと思います。apache、nginxはファイルを提供するように最適化されており、リクエストはアプリを経由する必要はありません。

于 2013-02-01T17:53:06.240 に答える