2012-08-09 20 views
7

私はPythonでWebアプリケーションを構築しています(Flaskを使用しています)。私はSQLAlchemyまたは類似のORMシステムを使用するつもりはなく、Psycopg2を直接使用するつもりです。PostgreSQLの接続をPython Webアプリケーションにプールするか、リクエストごとに新しい接続を作成する必要がありますか?

新しいリクエストごとに新しいデータベース接続を開いて(それに続いて閉じる必要がありますか)または、これらの接続をプールするために何かを使用する必要がありますか?

答えて

9

PgBouncerは、アプリケーションとサーバーにとって非常にきれいで透明です。

私たちは、1年間の生産で2年間、生産中にPgBouncerを使用してきました。これは、非常に素晴らしいPostgreSQL接続プーラーです。

http://wiki.postgresql.org/wiki/PgBouncer

1

私は、このアプリケーションが複数のクライアントに並行して同時にサービスを提供する場合は、接続プールが最善のことだと思います。

2

答えがどうなるか、多くのそのような要求やどのように多くの並行ウェブアプリで依存しますか?あなたのウェブアプリケーションが100秒または1000秒の同時ログインユーザーでビジー状態になることが予想される場合は、通常、接続プーリングが優れています。サイドプロジェクトとしてこれを実行し、数百人未満のユーザーがいると思われる場合は、プールせずに。

1

ええ、接続プールは役立ちますが、はい、ライブ接続またはプールサイズの適切な数値は、データベースにかかる負荷に基づいて調べる必要があります。

from psycopg2.pool import SimpleConnectionPool 
    from contextlib import contextmanager 

    dbConnection = "dbname='dbname' user='postgres' host='localhost' password='postgres'" 

    # pool define with 10 live connections 
    connectionpool = SimpleConnectionPool(1,10,dsn=dbConnection) 

    @contextmanager 
    def getcursor(): 
     con = connectionpool.getconn() 
     try: 
      yield con.cursor() 
     finally: 
      connectionpool.putconn(con) 

    def main_work(): 
     try: 
      # with here will take care of put connection when its done 
      with getcursor() as cur: 
       cur.execute("select * from \"TableName\"") 
       result_set = cur.fetchall() 

     except Exception as e: 
      print "error in executing with exception: ", e