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

Tomcat 7.0.42 pooling, hibernate 4.2, solusi autoreconnect mysql rock solid

Pertanyaan yang bagus. Saya biasa bergumul dengan pertanyaan ini. Jawaban paling umum pada stackoverflow adalah "Tergantung ...." untuk hampir setiap masalah. Saya benci mengatakannya tetapi tidak ada tempat yang lebih relevan daripada mengutak-atik kumpulan koneksi Anda. Ini benar-benar permainan penawaran dan permintaan, di mana permintaan koneksi Anda adalah permintaan dan penawaran adalah jumlah koneksi yang tersedia MySQL. Itu benar-benar tergantung pada apakah perhatian utama Anda adalah mencegah koneksi basi dikembalikan dari kumpulan, atau apakah kekhawatiran Anda memastikan MySQL tidak kelebihan beban dengan koneksi idle karena Anda tidak mematikannya dengan cukup cepat. Kebanyakan orang lye di tengah beberapa tempat.

Jika Anda benar-benar memahami mengapa seseorang memilih salah satu konfigurasi kumpulan koneksi, percayalah, Anda akan berhenti mencari pengaturan "Rocket Solid" karena Anda akan tahu bahwa itu seperti mencari rencana bisnis ke toko Anda; Ini sepenuhnya berakar pada berapa banyak permintaan koneksi yang Anda dapatkan dan berapa banyak koneksi persisten yang ingin Anda sediakan. Di bawah ini saya berikan contoh mengapa Anda akan menggunakan pengaturan tertentu. Saya merujuk variabel yang harus Anda ubah di dalam tag "Sumber Daya" dari tag "Konteks" dari file Context.xml Anda. Contoh konfigurasi lengkap dapat dilihat di bagian paling bawah.

Lalu Lintas Rendah

Dalam situasi ini, Anda memiliki sedikit permintaan ke aplikasi Anda sehingga ada kemungkinan besar SEMUA koneksi di kumpulan koneksi Anda akan basi dan permintaan pertama oleh aplikasi Anda dengan koneksi basi akan menyebabkan kesalahan. (Tergantung pada driver MySQL yang Anda gunakan, kesalahan dapat menjelaskan bahwa paket terakhir yang berhasil diterima melebihi pengaturan wait_timeout database). Jadi strategi kumpulan koneksi Anda adalah mencegah koneksi mati dikembalikan. Dua opsi berikut memiliki sedikit efek samping untuk situs dengan lalu lintas rendah.

  • Tunggu Lebih Lama Sebelum Memutuskan Koneksi - Anda akan melakukannya dengan mengubah nilai wait_timeout dalam konfigurasi MySQL Anda. Di meja kerja MYSQL Anda dapat menemukan pengaturan itu dengan mudah di bawah Admin> File konfigurasi> Jaringan. Untuk situs dengan banyak lalu lintas, ini tidak sering disarankan karena dapat menyebabkan kumpulan selalu diisi dengan banyak koneksi yang tidak aktif. Tapi ingat ini adalah skenario lalu lintas rendah.

  • Uji Setiap Koneksi - Anda dapat melakukannya dengan menyetel testOnBorrow = true dan validationQuery= "SELECT 1" . Bagaimana dengan kinerja? Anda memiliki lalu lintas yang rendah dalam situasi ini. Menguji setiap koneksi yang dikembalikan dari kumpulan tidak menjadi masalah. Artinya, kueri tambahan akan ditambahkan ke setiap transaksi MySQL yang Anda lakukan pada satu koneksi. Di situs dengan lalu lintas rendah, apakah ini benar-benar sesuatu yang Anda khawatirkan? Masalah koneksi Anda mati di kolam karena tidak digunakan adalah fokus utama Anda.

Lalu Lintas Sedang

  • Periksa Semua Koneksi Secara Berkala -Jika Anda tidak ingin menguji setiap koneksi setiap kali digunakan, atau memperpanjang waktu tunggu, maka Anda dapat menguji semua koneksi secara berkala dengan kueri default atau kustom yang Anda pilih. Misalnya set validationQuery = "SELECT 1" , testWhileIdle = "true" , dan timeBetweenEvictionRunsMillis = "3600" atau interval apa pun yang Anda inginkan. Untuk lalu lintas yang sangat rendah ini benar-benar akan membutuhkan lebih banyak pekerjaan. Pikirkan tentang itu. Jika Anda memiliki 30 koneksi di pool dan dalam 1 jam hanya 4 yang dipanggil, maka Anda dapat dengan mudah memeriksa semua 4 koneksi pada setiap permintaan menggunakan testOnBorrow sebelumnya pendekatan dengan sedikit hit kinerja. Tetapi jika sebaliknya Anda melakukan pendekatan "Periksa semua setiap jam" maka Anda membuat 30 permintaan untuk memeriksa semua koneksi ketika hanya4 yang digunakan.

Lalu Lintas Tinggi

  • Hancurkan Koneksi Menganggur Lebih Cepat - Ini adalah situasi yang membuat semua orang mengatakan Anda tidak boleh memperpanjang wait_timeout dan Anda tidak boleh menguji setiap koneksi. Ini bukan model yang ideal untuk setiap situasi. Ketika Anda memiliki lalu lintas yang signifikan, setiap koneksi di kumpulan akan digunakan dan masalah Anda yang sebenarnya akan menjadi peningkatan jumlah koneksi yang tersedia sementara sebenarnya memperpendek panjang wait_time Anda jadi Anda tidak mengakhiri banyak koneksi idle di DB. Berikut adalah contoh seorang pria berbicara tentang bagaimana dia memiliki hingga 10.000 koneksi menganggur sehari untuk situs yang sibuk sehingga dia ingin menurunkan waktu tunggu Menurunkan wait_timeout untuk situs yang sibuk

Contoh Konfigurasi Context.xml

<Context>   

<Resource name="jdbc/TestDB"
          auth="Container"
          type="javax.sql.DataSource"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          testWhileIdle="true"
          testOnBorrow="true"
          testOnReturn="false"
          validationQuery="SELECT 1"
          validationInterval="30000"
          timeBetweenEvictionRunsMillis="30000"
          maxActive="100"
          minIdle="10"
          maxWait="10000"
          initialSize="10"
          removeAbandonedTimeout="60"
          removeAbandoned="true"
          logAbandoned="true"
          minEvictableIdleTimeMillis="30000"
          jmxEnabled="true"
          jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
            org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
          username="root"
          password="password"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/mysql"/>
</Context>

Contoh konfigurasi web.xml

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
  <description>MySQL Test App</description>
  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

Dokumentasi tentang properti Tomcat Pool untuk mengubah Tomcat Pool




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bidang tanggal waktu Django - konversikan ke zona waktu dalam tampilan

  2. berikan akses jarak jauh database MySQL dari alamat IP mana pun

  3. Bagaimana Menghubungkan PHP ke MySQL

  4. Metode hashing kata sandi MySQL lama vs baru

  5. Mysql mengubah charset tabel default menjadi charset database