Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara termurah untuk menentukan apakah koneksi MySQL masih hidup

Anda tidak akan mengetahui status koneksi yang sebenarnya tanpa melalui kabel , dan SELECT 1 adalah kandidat yang cukup baik (bisa dibilang Anda bisa membuat perintah yang lebih pendek yang membutuhkan lebih sedikit waktu untuk menguraikan, tetapi dibandingkan dengan jaringan atau bahkan latensi loopback, penghematan itu tidak signifikan.)

Karena itu, saya berpendapat bahwa melakukan ping ke koneksi sebelum memeriksanya dari kolam bukanlah pendekatan terbaik .

Anda mungkin harus meminta pengelola kumpulan koneksi Anda menerapkan kebijakan keep-alive (batas waktu) sendiri untuk menghindari pemutusan oleh server (singkat dari masalah konektivitas intervensi yang lebih serius, yang dapat mempengaruhi Anda di tengah operasi reguler - dan yang manajer kumpulan koneksi Anda tidak akan dapat membantu), serta agar tidak memonopoli database (pikirkan penanganan file dan penggunaan memori) yang tidak perlu.

Oleh karena itu dipertanyakan, menurut pendapat saya, apa nilai pengujian untuk kondisi konektivitas sebelum memeriksa koneksi dari kolam yang sebenarnya. Mungkin ada baiknya menguji status koneksi sebelum koneksi diperiksa kembali ke kumpulan , tetapi itu dapat dilakukan secara implisit dengan hanya menandai koneksi sebagai kotor ketika kesalahan keras SQL (atau pengecualian yang setara) muncul (kecuali API yang Anda gunakan sudah memperlihatkan is-bad -seperti panggilan untukmu.)

Oleh karena itu saya akan merekomendasikan:

  • menerapkan kebijakan keep-alive sisi klien
  • tidak melakukan pemeriksaan apa pun saat memeriksa koneksi dari kumpulan
  • melakukan pemeriksaan kotor sebelum koneksi dikembalikan ke pool
  • biarkan kode aplikasi menangani kondisi koneksi luar biasa lainnya (non-timeout)

PERBARUI

Tampaknya dari komentar Anda bahwa Anda benar-benar sangat ingin melakukan ping ke koneksi (saya berasumsi itu karena Anda tidak memiliki kendali penuh atas, atau pengetahuan tentang, karakteristik batas waktu pada server MySQL atau peralatan jaringan yang mengganggu seperti proxy, dll.)

Dalam hal ini Anda dapat menggunakan DO 1 sebagai alternatif dari SELECT 1; itu sedikit lebih cepat -- lebih pendek untuk diuraikan, dan tidak mengembalikan data aktual (walaupun Anda akan dapatkan ack TCP s, jadi Anda masih akan melakukan validasi bolak-balik bahwa koneksi masih terjalin.)

PERBARUI 2

Mengenai pos Joshua , inilah jejak pengambilan paket untuk berbagai skenario:

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>

Seperti yang Anda lihat, kecuali fakta bahwa mysql_ping paket adalah 5 byte, bukan DO 1; 9 byte, jumlah perjalanan pulang pergi (dan akibatnya, latensi yang diinduksi jaringan) persis sama. Satu-satunya biaya tambahan yang Anda bayarkan dengan DO 1 sebagai lawan dari mysql_ping adalah penguraian DO 1 , yang sepele.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbaiki Peringatan MySQL 1287:'BINARY expr' tidak digunakan lagi dan akan dihapus dalam rilis mendatang

  2. Temukan catatan duplikat di MySQL

  3. PHP :masukkan beberapa nilai kotak centang ke dalam satu kolom MySQL

  4. Pemulihan Penuh Cluster MySQL atau MariaDB Galera dari Cadangan

  5. Bagaimana saya bisa memfilter kueri berdasarkan porsi jam bidang DateTime di MySQL?