2011-07-14 11 views
13

私はFlaskチュートリアルを見ていて、Webリクエストごとに新しいデータベース接続を作成することを提案しています。物事をするのは正しい方法ですか?私はいつも、データベース接続はスレッドごとに1回だけ作成されるべきだと考えました。フラスコやその他のPython Webサーバーでスレッドセーフなアプリケーションを維持しながら、これを行うことができますか?Python Webサーバーでデータベース接続を維持する方法

答えて

11

学習目的のために、はいとしてください。しかし、実稼働環境で実行されている実際のアプリケーションでは、理想的な状況ではありません。

通常、アプリケーションとデータベースの間には常に接続プールが必要です。どの言語/データベースを使用していても、これは一般的な解決策です。

データベース接続プールは、多数の接続を開いています。アプリケーション層は単に使用されていない接続を取るだけであり、アプリケーション層がもはやそれらを必要としないときに接続が解放される。 「リリースされた」とは、彼らは再び使用するためにプールに戻ってくることを意味します。

ボトムラインでは、要求ごとに接続がオープン/クローズされません。それらはデータベース接続プールから取得/解放されます。

たとえば、Pythonとmysqlを使用すると、PySQLPoolに行くことができます。

9

は、それぞれが移動するための方法を要求する新しい接続を作成していますか?いいえ。大規模なアプリケーションの場合は、ORMに興味がない場合でも、SQLAlchemy(接続プールを構成できる)を使用することを強くお勧めします。ドキュメントには実際にそれに関するセクションがあります:http://flask.pocoo.org/docs/patterns/sqlalchemy/#sql-abstraction-layer

+7

私はORMパスを避けようとしています。これは、簡単に直接行うことができる抽象レイヤーを追加するためです。 – Pankaj

+0

接続プールより簡単なソリューションはありますか?私は簡単にいくつかの接続を開いておく余裕があります。私はちょうど少数の労働者しか持たないので、労働者一人あたりのつながりは問題ではない。 – AlexC

0

私の経験では、よく接続を頻繁に閉じることをお勧めします。特に、MySQLはしばらくの間アイドル状態になっていた接続を閉じたい場合があります。また、永続的な接続を古い状態にしてアプリケーションを応答不能にすることがあります。

あなたが本当にやりたいことは、接続が稼働しているが何もしていない時間の割合である「デッド接続時間」を最適化することです。毎回のリクエストで新しい接続を作成する場合、そのデッドタイムはセットアップとティアダウンの時間だけです。一度だけ(スレッドごとに)接続を行い、悪くならない場合、デッドタイムはアイドル時間です。

アプリケーションが少数のリクエストしか処理していない場合、発生する接続の数も少なくなるため、接続を開いたままアイドルにする利点はあまりありません。もう一方の極端な場合、アプリケーションが非常にビジー状態の場合、接続はほとんどアイドル状態にならず、すぐに再オープンされる接続のクローズも無駄になります。途中で、新しいリクエストが飛行要求に従うことが時々ありますが、時にはそうでない場合は、プールサイズ、リクエストタイムアウトなどのパフォーマンスチューニングを行う必要があります。

接続プールを使用して接続を開いている非常にビジーなアプリケーションは、1種類のデッドタイムしか表示しません。接続が悪くなったために戻ってこない要求を待っています。この問題の簡単な解決策は、プールからリクエストへの接続を提供する前に既知の良いクエリ(MySQLの場合はSELECT 1)を実行し、すぐに返ってこない場合はリサイクルすることです。

関連する問題