Coldfusionのより興味深い「機能」の1つは、外部リクエストを処理する方法です。その基本的な要点は、クエリが外部ソースに対して、<cfquery>
またはその他の外部要求を介して行われる場合、外部要求を特定のドライバーに渡し、その時点でCF自体がそれを一時停止できないことです。クエリまたはcfsettingでタイムアウトが指定されている場合でも、すべての外部要求でタイムアウトは完全に無視されます。
http://www.coldfusionmuse.com/index.cfm/2009/6/9/killing.threads
そのことを念頭に置いて、私たちが遭遇した問題は、CFサーバーとmySQLサーバー間の通信がうまくいかず、ハングしたスレッドが残ることがあるということです。以下の特徴があります。
- ハングしたスレッドはCFに表示され、FusionReactorから強制終了することはできません。
- mySQLにハングしたスレッドは表示されず、アクティブな実行中のクエリもありません(通常のスリープのみ)。
- データベースは他の呼び出しに応答しており、正しく動作しているように見えます。
- DBまたはユーザーの最大接続数に達していません。
私には、CFが何らかの形でリクエストを行っており、mySQLがそのリクエストに応答しているが、CFが無視し、mySQLからの応答を待ってスレッドを開いたままにしておくという回答しか考えられないようです。これは、データベースに問題の兆候が見られない理由を説明しますが、CFはスレッドを開いたままにして謎の答えを待ちます。
通常、これらのハングしたスレッドは、他の方法で機能しているスクリプト(ニュース記事へのコメントの投稿など)にランダムに表示されます。そのスクリプトに対して1つのスレッドがハングしている場合でも、そのスクリプトに対する他の要求は実行されます。これは、スクリプトに必ずしも障害があるのではなく、スクリプトの実行時に直面した状態を意味します。
mysqlによって生成されたmax_connectionsエラーではないことを確認するためにいくつかのテストを実行しました...ユーザーを作成し、それに1つの最大接続を与え、その接続をsleep(1000)クエリと結び付け、別のクエリを実行しました。残念ながら、ハングしたスレッドを生成せずに正しくエラーになりました。
だから、私はこの時点で何が悪いのか全く手がかりがないままになっています。サーバー間の通信がうまくいかない原因となる可能性のある他の接続制限またはタイムアウトはありますか?