質問

mysqlの接続プロセスは、他のRDBMSと比較して非常に高速に設計されているため、 a接続プールを提供するライブラリ(SQLAlchemy)は、接続プールを有効にすると実際にはそれほど役に立ちません。

これに関する経験はありますか?

いくつかのコードがdb接続に対してステートフルな何かをし、(おそらく誤って)それ自体をクリーンアップしない場合、通常は接続を閉じたときにクリーンアップされる可能性があるため、私はそれを有効にしたくない代わりに、リサイクルされた接続を取得する後続のコードに伝播されます。

役に立ちましたか?

解決

SQLAの接続プールを使用する場合、アプリケーションがトランザクション分離レベルなどの接続全体のオプションを変更しない限り、接続の残存状態を心配する必要はありません(通常はそうではありません)。 SQLAの接続プールは、チェックイン時に接続に対してconnection.rollback()を発行し、トランザクション状態またはロックがクリアされるようにします。

MySQLの接続時間が非常に速い可能性があります。特に、同じマシンでUNIXソケットを介して接続している場合はそうです。接続プールを使用する場合は、MySQLのクライアントライブラリが8時間以上アイドル状態の接続を自動的にシャットダウンするため、一定期間後に接続がリサイクルされるようにすることも必要です(SQLAlchemyでは、これはpool_recycleオプションです)。 / p>

プール実装をデフォルトのQueuePoolからNullPoolに変更することで、SQLAアプリケーションで接続プールと非プールのベンチングをすばやく行うことができます。これは、実際には何もプールしないプール実装です。プロキシ接続が取得され、後で閉じられたときに実際になります。

他のヒント

MySQL自体の接続部分が非常に滑らかであっても、おそらくネットワーク接続が関係している(ループバックであろうと物理的であろうと)。リクエストをたくさん行っている場合、かなりの費用がかかる可能性があります。もちろん、アプリケーションの動作に依存します(多くの場合そうです)-もちろん、接続ごとに多くの作業をしている場合は、それが支配的になり、多くは得られません。

疑わしい場合、ベンチマーク-しかし、私は接続プールライブラリ(少なくとも、評判の良いライブラリ)が適切に動作し、適切にリセットする必要があると信じています。

簡単な答え:ベンチマークする必要があります。

長答:状況によります。 MySQLは接続のセットアップが高速であるため、そのコストを回避することは、接続プーリングを行う正当な理由ではありません。クエリを実行する回数が少なくて速い場合は、プーリングで勝利するので、そこに勝ちます。

他の心配は、アプリケーションがSQLスレッドをどのように扱うかです。 SQLトランザクションを実行せず、スレッドの状態について何も想定していない場合、プーリングは問題になりません。 OTOH、スレッドのクローズに依存して一時テーブルを破棄したり、トランザクションをロールバックしたりするコードには、プーリングに関する多くの問題があります。

データベースクエリを実行するたびにjava.sql.Connectionオブジェクトを作成する必要がないため、接続プールは高速化します。私は、Tomcat接続プールを使用して、多くのクエリを実行するWebアプリケーション用のmysqlデータベースに接続します。ユーザーの負荷が高い場合、顕著な速度の改善が見られます。

Djangoで簡単なRESTfulサービスを作成し、接続プーリングを使用して、または使用せずにテストしました。私の場合、違いは非常に顕著でした。

LANでは、LANがない場合、応答時間は1〜5秒でした。これにより、20ミリ秒未満になります。 結果は異なる場合がありますが、MySQL&で使用している構成は異なります。 Apacheサーバーはかなり標準的なローエンドです。

インターネット経由でUIページを提供している場合、余分な時間はユーザーには気付かないかもしれませんが、私の場合は受け入れられなかったので、プールの使用を選択しました。これがお役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top