ネットワークを経由しないと、接続の実際の状態を知ることはできません 、およびSELECT 1
は十分な候補です(おそらく、解析にかかる時間が短いコマンドを思い付くことができますが、ネットワークやループバックレイテンシと比較しても、これらの節約は重要ではありません)。
そうは言っても、接続を前にpingすると主張します。 プールからチェックアウトするのは最善の方法ではありません 。
おそらく、接続プールマネージャーに独自のキープアライブ(タイムアウト)ポリシーを適用させる必要があります。 サーバーによって切断されないようにするため(接続プールの管理者がとにかく支援できない、通常の操作の途中でスマックに影響を与える可能性のある、より深刻な介入接続の問題がない限り)、および<強い>データベースを占有しないために (ファイルハンドルとメモリ使用量を考えてください)不必要に。
したがって、私の意見では、プールから接続をチェックアウトする前に接続状態をテストする価値が実際にどのようなものであるかは疑問です。 接続がプールにチェックインされる前に接続ステータスをテストする価値がある場合があります 、ただし、SQLハードエラー(または同等の例外)が発生したときに接続をダーティとしてマークするだけで暗黙的に実行できます(使用しているAPIがすでにis-bad
を公開している場合を除く) -あなたへの電話のように。)
したがって、私はお勧めします:
- クライアント側の維持ポリシーの実装
- プールから接続をチェックアウトするときにチェックを実行しない
- 接続がプールに返される前にダーティチェックを実行する
- アプリケーションコードに他の(タイムアウトではない)例外的な接続条件を処理させます
更新
あなたのコメントから、あなたは本当に本当に 接続に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
という事実を除いて パケットはDO 1;
ではなく5バイトです の9バイトでは、ラウンドトリップの数(したがって、ネットワークに起因する遅延)はまったく同じです。 DO 1
で支払う唯一の追加費用 mysql_ping
とは対照的に DO 1
の解析です 、これは些細なことです。