私はFlaskチュートリアルを見ていて、Webリクエストごとに新しいデータベース接続を作成することを提案しています。物事をするのは正しい方法ですか?私はいつも、データベース接続はスレッドごとに1回だけ作成されるべきだと考えました。フラスコやその他のPython Webサーバーでスレッドセーフなアプリケーションを維持しながら、これを行うことができますか?Python Webサーバーでデータベース接続を維持する方法
答えて
学習目的のために、はいとしてください。しかし、実稼働環境で実行されている実際のアプリケーションでは、理想的な状況ではありません。
通常、アプリケーションとデータベースの間には常に接続プールが必要です。どの言語/データベースを使用していても、これは一般的な解決策です。
データベース接続プールは、多数の接続を開いています。アプリケーション層は単に使用されていない接続を取るだけであり、アプリケーション層がもはやそれらを必要としないときに接続が解放される。 「リリースされた」とは、彼らは再び使用するためにプールに戻ってくることを意味します。
ボトムラインでは、要求ごとに接続がオープン/クローズされません。それらはデータベース接続プールから取得/解放されます。
たとえば、Pythonとmysqlを使用すると、PySQLPoolに行くことができます。
ここでは、パフォーマンスとさまざまなソリューションを比較しています。 (PostgreSQLの)
ショートバージョン: pgBouncer
のロングバージョンを見て: http://www.askthepony.com/blog/2011/07/django-and-postgresql-improving-the-performance-with-no-effort-and-no-code/
は、それぞれが移動するための方法を要求する新しい接続を作成していますか?いいえ。大規模なアプリケーションの場合は、ORMに興味がない場合でも、SQLAlchemy(接続プールを構成できる)を使用することを強くお勧めします。ドキュメントには実際にそれに関するセクションがあります:http://flask.pocoo.org/docs/patterns/sqlalchemy/#sql-abstraction-layer
私の経験では、よく接続を頻繁に閉じることをお勧めします。特に、MySQLはしばらくの間アイドル状態になっていた接続を閉じたい場合があります。また、永続的な接続を古い状態にしてアプリケーションを応答不能にすることがあります。
あなたが本当にやりたいことは、接続が稼働しているが何もしていない時間の割合である「デッド接続時間」を最適化することです。毎回のリクエストで新しい接続を作成する場合、そのデッドタイムはセットアップとティアダウンの時間だけです。一度だけ(スレッドごとに)接続を行い、悪くならない場合、デッドタイムはアイドル時間です。
アプリケーションが少数のリクエストしか処理していない場合、発生する接続の数も少なくなるため、接続を開いたままアイドルにする利点はあまりありません。もう一方の極端な場合、アプリケーションが非常にビジー状態の場合、接続はほとんどアイドル状態にならず、すぐに再オープンされる接続のクローズも無駄になります。途中で、新しいリクエストが飛行要求に従うことが時々ありますが、時にはそうでない場合は、プールサイズ、リクエストタイムアウトなどのパフォーマンスチューニングを行う必要があります。
接続プールを使用して接続を開いている非常にビジーなアプリケーションは、1種類のデッドタイムしか表示しません。接続が悪くなったために戻ってこない要求を待っています。この問題の簡単な解決策は、プールからリクエストへの接続を提供する前に既知の良いクエリ(MySQLの場合はSELECT 1
)を実行し、すぐに返ってこない場合はリサイクルすることです。
- 1. Android - サーバーと長時間接続を維持する方法
- 2. データベースとJ2MEでWebサーバーを接続
- 3. Pythonが000webhost Webサーバーに接続するMySQLデータベース
- 4. サーバーを維持できる接続数とその接続方法は何ですか?
- 5. 接続を維持する
- 6. 複数のサーバー間でwebsocket接続オブジェクトを維持する
- 7. セッションを開始してRDDを維持するPythonを接続する方法
- 8. PHPでmysql接続を維持する方法
- 9. バックグラウンドでiphone ios xmppの接続を維持する方法は?
- 10. スレッドでサーバーへの接続を維持していますか?
- 11. httpサーバーとの接続を維持できますか?
- 12. エクスプレスでmysql接続を維持する
- 13. iOS BLEペリフェラルへの接続と接続を維持する最良の方法
- 14. SSHJを使ってSSH接続を維持する方法は?
- 15. ePOS2 SDK:プリンタとの接続を維持する方法は?
- 16. Boost asio:クライアント接続を維持する方法
- 17. Java - ライブソケット接続を維持する方法
- 18. Visual FoxProからmysql接続を維持する方法
- 19. Webサーバーとブラウザ(Python)の接続
- 20. WebSocketの接続を維持する
- 21. Pythonサーバー接続
- 22. golang1.4 httpサーバーアイドル接続を維持する
- 23. SignalRクライアントの接続を維持する
- 24. firebase接続を維持する
- 25. Socket.io - ソケット接続を維持する(Swift)
- 26. Pythonとのリモート接続を開く(および維持する)
- 27. 自宅のJavaサーバーから永続的な接続を維持する
- 28. AndroidアプリをWebサーバーに接続する方法
- 29. asp.net WebサーバーをiPhoneに接続する方法
- 30. chrome web extensionをlocalhostサーバーに接続する方法は?
私はORMパスを避けようとしています。これは、簡単に直接行うことができる抽象レイヤーを追加するためです。 – Pankaj
接続プールより簡単なソリューションはありますか?私は簡単にいくつかの接続を開いておく余裕があります。私はちょうど少数の労働者しか持たないので、労働者一人あたりのつながりは問題ではない。 – AlexC