VisualVM menghitung utas sebagai menggunakan waktu CPU setiap kali JVM menganggapnya dapat dijalankan. Ini berarti bahwa setiap utas yang tidak menunggu di kunci dianggap dapat dijalankan, kurang lebih, termasuk utas yang menunggu I/O di kernel! Di sinilah besarnya penggunaan CPU di com.myql.jdbc.utils.ReadAheadInputStream.fill()
datang dari. Jadi, alih-alih masalah CPU, Anda memiliki masalah I/O.
Ada beberapa hal yang dapat Anda lakukan di sisi JVM, tetapi tidak banyak pengoptimalan langsung:
- Ubah ukuran kumpulan koneksi. 1.000 kueri bersamaan adalah lot . Kecuali jika instance MySQL Anda benar-benar masif, ia akan mengalami masalah dalam menangani tingkat beban itu, dan menghabiskan banyak waktu hanya dengan beralih antar kueri. Coba turunkan ukuran kolam, menjadi 250 atau bahkan 50, dan lakukan benchmark di sana.
- Lakukan kueri lebih sedikit atau lebih kecil. Jika aplikasi Anda kecil, mungkin terlihat sepele bahwa setiap baris dari setiap kueri diperlukan, tetapi mungkin aplikasi Anda lebih besar dari itu. Apakah tempat berbeda yang menanyakan data yang sama, atau dapatkah dua kueri berbeda digabungkan menjadi satu yang akan memenuhi keduanya?