sql >> データベース >  >> RDS >> Mysql

MySQL接続がまだ生きているかどうかを判断するための最も安価な方法

    ネットワークを経由しないと、接続の実際の状態を知ることはできません 、および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の解析です 、これは些細なことです。



    1. MySQLで数値の範囲を生成する

    2. 2つのテーブルのいくつかの条件に基づいて発生をカウントします

    3. SQLite Min()のしくみ

    4. ブロックチェーン:それは何であり、どのように機能し、ビッグデータにとって何を意味するのか