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

c3p0 maxIdleTime sama dengan wait_timeout dari mysql?

Pertama Mari kita pahami properti mysql.

  • interactive_timeout :waktu habis interaktif untuk sesi shell mysql dalam hitungan detik seperti mysqldump atau alat baris perintah mysql. koneksi dalam keadaan tidur. Sebagian besar waktu ini diatur ke nilai yang lebih tinggi karena Anda tidak ingin terputus saat Anda melakukan sesuatu di cli mysql.
  • wait_timeout :jumlah detik selama tidak aktif yang akan ditunggu MySQL sebelum menutup koneksi pada koneksi non-interaktif dalam hitungan detik. contoh:terhubung dari java. koneksi dalam keadaan tidur.

Sekarang mari kita pahami properti c3po dan hubungannya dengan props DB. (Saya hanya akan menyalin dari pertanyaan Anda)

Ini mengacu pada berapa lama objek koneksi dapat digunakan dan akan tersedia di kumpulan. Setelah batas waktu berakhir, c3po akan menghancurkannya atau mendaur ulangnya.

Sekarang masalahnya muncul ketika Anda memiliki maxIdleTime lebih tinggi dari wait_timeout .misalkan jika mxIdleTime : 50 detik dan wait_timeout : 40 s maka ada kemungkinan Anda akan mendapatkan Connection time out exception: Broken Pipe jika Anda mencoba melakukan operasi apa pun dalam 10 detik terakhir. Jadi maxIdelTime harus selalu kurang dari wait_timeout .

Alih-alih maxIdleTime, Anda bisa mendapatkan properti berikut.

  • idleConnectionTestPeriod menetapkan batas berapa lama koneksi akan tetap menganggur sebelum mengujinya. Tanpa preferredTestQuery , defaultnya adalah DatabaseMetaData.getTables() - yang merupakan agnostik basis data, dan meskipun panggilan yang relatif mahal, mungkin baik untuk basis data yang relatif kecil. Jika Anda paranoid tentang kinerja, gunakan kueri khusus untuk database Anda (i.e. preferredTestQuery="SELECT 1")
  • maxIdleTimeExcessConnections akan mengembalikan connectionCount backdown ke minPoolSize setelah lonjakan aktivitas.

Harap dicatat bahwa salah satu properti kumpulan (mis. maxIdleTime ) hanya mempengaruhi koneksi yang ada di pool yaitu jika hibernasi telah memperoleh koneksi dan membuatnya tidak digunakan selama lebih dari maxIdleTime dan kemudian mencoba melakukan operasi apa pun maka Anda akan mendapatkan "Pipa Rusak"

Sebaiknya memiliki wait_timeout yang lebih rendah di mysql tetapi itu tidak selalu benar ketika Anda memiliki aplikasi yang sudah dibangun. Anda harus memastikan sebelum menguranginya bahwa dalam aplikasi Anda, Anda tidak membiarkan koneksi terbuka lebih dari wait_time keluar.

Anda juga harus mempertimbangkan bahwa memperoleh koneksi adalah tugas yang mahal dan jika waktu tunggu terlalu rendah maka itu mengalahkan seluruh tujuan memiliki kumpulan koneksi, karena akan sering mencoba untuk mendapatkan koneksi.

Ini sangat penting ketika Anda tidak melakukan manajemen koneksi secara manual misalnya saat Anda menggunakan API transnasional Spring. Musim semi memulai transaksi saat Anda memasukkan @Transaction metode beranotasi sehingga memperoleh koneksi dari kumpulan. Jika Anda melakukan panggilan layanan web atau membaca beberapa file yang akan memakan waktu lebih lama daripada wait_time out maka Anda akan mendapatkan pengecualian.

Saya pernah menghadapi masalah ini.

Di salah satu proyek saya, saya memiliki cron yang akan melakukan pemrosesan pesanan untuk pelanggan. Untuk membuatnya lebih cepat saya menggunakan pemrosesan batch. Sekarang setelah saya mengambil sejumlah pelanggan dan melakukan beberapa pemrosesan (tidak ada panggilan db). Ketika saya mencoba untuk menyimpan semua pesanan yang saya gunakan untuk mendapatkan pengecualian pipa yang rusak. Masalahnya adalah wait_timeout saya adalah 1 menit dan pemrosesan pesanan memakan waktu lebih lama dari itu. Jadi Kami harus meningkatkannya menjadi 2 menit. Saya bisa saja mengurangi ukuran batch tetapi itu membuat keseluruhan pemrosesan menjadi lebih lambat.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO::PARAM untuk tipe desimal?

  2. Kolasi Case Sensitive di MySQL

  3. php mysqli_connect:metode otentikasi tidak diketahui oleh klien [caching_sha2_password]

  4. Pencarian teks lengkap di mysql dengan kata 3 huruf

  5. Menghubungkan ke MySQL Menggunakan Python