Python で Web アプリを作成しています (Flask を使用)。SQLAlchemy や同様の ORM システムを使用するつもりはありません。むしろ、Psycopg2 を直接使用するつもりです。
新しいリクエストごとに新しいデータベース接続を開く必要がありますか(その後閉じますか?) または、これらの接続をプールするために何かを使用する必要がありますか?
Python で Web アプリを作成しています (Flask を使用)。SQLAlchemy や同様の ORM システムを使用するつもりはありません。むしろ、Psycopg2 を直接使用するつもりです。
新しいリクエストごとに新しいデータベース接続を開く必要がありますか(その後閉じますか?) または、これらの接続をプールするために何かを使用する必要がありますか?
PgBouncerは非常にきちんとしていて、アプリケーションとサーバーに対して透過的です。
PgBouncerを本番環境で2年間使用しており、問題は1つもありません。それはかなり素晴らしいPostgreSQL接続プールです。
はい、接続プーリングは役立ちますが、データベースにかかる負荷に基づいて、ライブ接続またはプールサイズの適切な数値を見つける必要があります。
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
答えは、そのようなリクエストがいくつ発生するか、および Web アプリで同時にいくつが発生するかによって異なります。Web アプリが数百人、場合によっては数千人のユーザーが同時にログインしてビジー状態になることが予想される場合は、通常、接続プールを使用することをお勧めします。サイド プロジェクトとしてのみこれを実行しており、数百人未満のユーザーが予想される場合は、おそらく回避できます。プーリングなし。
このアプリケーションが複数のクライアントに同時にサービスを提供する場合は、接続プーリングが最適だと思います。