最安値を決める場合のMySQLの接続がまだ生きてい
質問
私にはプールのMySQLの接続のためのwebベースのデータサービスです。に起動するとサービスの要請であり、からの接続にプールに利用します。問題はた場合には、大きなボラティリティーはその接続に使用されて、サーバがタイムで閉じます。今まで検出可能なこのプール管理コードです。
フレキシビリティをここにる環境がい符号化を与えてもらい、非常に抽象的なAPIを接続します。私は基本的にのみ実行SQL文を書きます。思っていたアクセスを実際のソケットまたは直接アクセスにはMySQLクライアントAPIに含まれています。
その質問は 何が最も安いMySQL算書きを実行し、接続するかどうかを判定します。例えば、 SELECT 1;
するべきだったものがある場合でも安くなるのですか?そうしないもの線が取り扱うのはMySQLクライアントリチウムイオン電池及び有効回答と同じか
解明: んご関係を確かめるとともに、場合にはMySQLサーバが実行までのデータベースの設定は十分に答えます。場合はそういうものは、その後のSQLサービスを実行します取り扱い、適切なエラーになります。私はだけは本当に関する場合は、TCP接続をオープン---以降の場合、サーバを閉じて、そのウェブサービスのSQLませんエラーが発生することで再投入してから、再度挿入してください"という不便な回のmuckのサービスのコードです。
休業: の /* ping */
hackのでありトラムを乗り継いで行けるよう、私は、alasのみによJDBC.読書を通じてのドキュメントがハッキングでは明らかであ 正確に と同様の理由にしたかったのです。に興味のある人は、仕事をしている Haskel, 使用し、 HDBC や HDBC-mysql.私の著者のHDBC-mysqlを追加す mysql_ping()
は、直接または類似のhack.
ヴラドの DO 1
にもなったようなことがいえるでしょうた後、以降のその他のhackでは利用できない外部のJDBCが使用しています。
全体的にシミュレーション、特に@ヴラド!
解決
す ませんのサイトに接続せずに、ワイヤー, は、 SELECT 1
は十分に良好な候補者(間違いう短いコマンドの時間構文解析などもありますが、以前に比べネットワークであるloopback遅延その貯蓄が軽微であります。)
するという pinging接続 前 チェックでプールからは最良のアプローチ.
きょうだいて接続プールマネージャー 実施独自のkeep-alive(タイムアウト方針 されないために切断され、サーバー(短深刻な介入の接続性の問題に悪影響を及ぼすおそれのあるおに舌鼓を中の定常業務かる接続プールマネージャーできるかど しないための独り占めのデータベース (filehandlesおよびメモリ使用できます)不必要.
その疑問に思う試験のための接続状態をチェックアウト直前からの接続にプールさん。するのが良いでしょう試験の接続状況 以前に接続確認のプール, もしかできない暗黙的なマーキングに接続して汚れた場合に、SQLハードエラーはそれに相当する例外が生じた場合は、APIを使用すでに公開し is-bad
-のように呼びます。)
これもひとえにお勧め:
- 実装クライアント側のkeep-alive policty
- なまずチェック時チェックアウトの接続にプールから
- 能汚れの確認の前に接続をプールに返す
- のアプリケーションコード対応その他(タイムアウト)の接続条件
更新
これからのコメントするまでには 本当に たpingの接続(ていると思っていたん完全に制御、知識、タイムアウトの特性に関するMySQLサーバー間ネットワーク機器などのプロキシなど)
この場合に利用できる DO 1
の代替として SELECT 1
;であ 幅 高速化--短縮構文解析し、返されるわけではありません実際のデータがす ま のTCP ack
s,いまだにエコノミークラス往復の妥当性を検証するの接続がまだ設立)
更新2
に関する ジョシュアのポスト, こちらのパケットキャプチャが行える痕跡のシナリオ:
SELECT 1;
13:51:01.463112 IP client.45893 > server.mysql: P 2270604498:2270604511(13) ack 2531191393 win 1460 <nop,nop,timestamp 2983462950 59680547>
13:51:01.463682 IP server.mysql > client.45893: P 1:57(56) ack 13 win 65306 <nop,nop,timestamp 59680938 2983462950>
13:51:01.463698 IP client.45893 > server.mysql: . ack 57 win 1460 <nop,nop,timestamp 2983462951 59680938>
DO 1;
13:51:27.415520 IP client.45893 > server.mysql: P 13:22(9) ack 57 win 1460 <nop,nop,timestamp 2983488906 59680938>
13:51:27.415931 IP server.mysql > client.45893: P 57:68(11) ack 22 win 65297 <nop,nop,timestamp 59681197 2983488906>
13:51:27.415948 IP client.45893 > server.mysql: . ack 68 win 1460 <nop,nop,timestamp 2983488907 59681197>
mysql_ping
14:54:05.545860 IP client.46156 > server.mysql: P 69:74(5) ack 78 win 1460 <nop,nop,timestamp 2987247459 59718745>
14:54:05.546076 IP server.mysql > client.46156: P 78:89(11) ack 74 win 65462 <nop,nop,timestamp 59718776 2987247459>
14:54:05.546092 IP client.46156 > server.mysql: . ack 89 win 1460 <nop,nop,timestamp 2987247459 59718776>
ご覧の通り、この mysql_ping
パケットが5バイトの代わりに DO 1;
's9バイトの数roundtrips(およびその結果、ネットワーク誘発遅延)が完全に同じなのです。の追加料金でお支払い DO 1
に対して mysql_ping
での解析 DO 1
, であるようにします。
他のヒント
私は、あなたが現在使用して(またはどのような言語)されているどのようなAPIわからないんだけど、Javaのため、JDBCドライバが行うことができ、特別なトリックがあります。
標準テストクエリです:
select 1
あなたが示されてきたように。あなたはそれを変更する場合:
/* ping */ select 1
JDBCドライバがこのことを気づく、および応答を取得するには、MySQLサーバにのみ単一のパケットを送信します。
私は、Java開発者とのための MySQLのヒントと題し日「ディープダイブ」のエピソードで、このことについて学びましたマーク・マシューズするます。
は、Javaを使用していない場合でも、多分これと同じトリックは他のMySQLドライバで実装されていますか?私はそれが応答を送信できるように、サーバーは、この特殊なパケットを認識する必要があるだろうと仮定...
「接続」とは、複数の意味を持っています。 MySQLは、ネットワークレベルだsocket-をリッスンし、「接続。」 MySQLは、クエリの実行および他のオーバーヘッドのためのコンテキストが含まれ、「データベース接続」を維持しています。
あなただけのサービスがリッスンしているかどうかを知りたい場合は、は、ポート(デフォルトが何であるかを知らない)ターゲットIPをリッスンしているかどうかを確認するためにネットワークレベルの呼び出しを実行することができるはずです。あなたが応答するためにMySQLのエンジンを取得したい場合は、私はあなたのSELECT 1
のアイデアは、それが実際にデータベースからデータをフェッチするが、エンジンがスピンアップして応答していることを確認していません。