Rumah  >  Artikel  >  Cara memantau aliran JPA Spring Data

Cara memantau aliran JPA Spring Data

WBOY
WBOYke hadapan
2024-02-22 14:01:071191semak imbas

editor php Youzi membawakan anda soalan dan jawapan java tentang pemantauan aliran JPA Data Musim Bunga. Semasa pembangunan, memantau aliran data dalam masa nyata adalah penting untuk pengoptimuman prestasi sistem dan penyelesaian masalah. Artikel ini akan memperkenalkan cara memantau aliran JPA Spring Data, membolehkan anda memahami dengan lebih baik proses pemprosesan data, mengesan masalah dalam masa dan mengendalikannya dengan sewajarnya. Mari bincangkan cara memantau aliran JPA Data Spring dengan berkesan dan meningkatkan kestabilan dan prestasi sistem!

Kandungan soalan

Saya cuba menggunakan penstriman jpa data spring seperti yang dijelaskan di blog ini. Walau bagaimanapun, saya tidak boleh memantau proses atau kemajuan dengan sebarang log. Sekiranya saya melihat berbilang pertanyaan sql yang dicetak dalam log apabila proses cuba mengekstrak data dalam kelompok? Jika tidak, maka bagaimana saya tahu bahawa semua baris tidak dimuatkan sekaligus?

Blog lain (seperti yang ini dan yang ini ) mencadangkan agar saya menukar mysql kepada hint_fetch_size 设置为 integer.min_value , yang saya fikir mungkin penyelesaiannya, tetapi ini membuang pengecualian berikut:

2024-01-29 14:40:20.843 amaran 78247 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.sqlexceptionhelper: Ralat sql: 0, sqlstate: s1000 2024-01-29 14:40:20.843 Ralat 78247 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.sqlexceptionhelper: Set hasil penstriman com.mysql.cj.protocol.a.result@ resultsetrowsstreaming. 4ca63fa5 masih aktif. Tiada kenyataan akan dikeluarkan semasa sebarang set hasil penstriman dibuka dan digunakan pada sambungan tertentu. Sebelum mencuba lebih banyak pertanyaan, pastikan anda telah memanggil .close() pada mana-mana set hasil penstriman aktif. Masa tamat: 48 org.springframework.orm.jpa.jpasystemexception: Tidak dapat mengekstrak set keputusan; di org.springframework.orm.jpa.vendor.hibernatejpadialect.converthibernateaccessexception(hibernatejpadialect.java:331)

Ini kod repositori saya:

@QueryHints(value = {
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE, value = "" + Integer.MIN_VALUE),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_CACHEABLE, value = "false"),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_READONLY, value = "true"),
})
@Query("SELECT s FROM Salary s")
Stream<Salary> findAllStream();

Saya rasa saya ingin mendapatkan jaminan jika cara di atas adalah cara yang betul untuk menggunakan pertanyaan strim dalam data spring jpa kerana saya sendiri tidak boleh memantau prestasi penstriman dengan pasti?

Dikemas kini

Pengecualian di atas berlaku kerana panggilan berulang ke kaedah findallstream dalam kaedah panggilan yang sama. Mengalih keluar salah satu daripadanya membetulkan pengecualian.

Penyelesaian

Saya tidak menemui sebarang konfigurasi log untuk menunjukkan sama ada data sedang diambil secara berkelompok. Tetapi saya telah menemui cara untuk menguji prestasi secara tempatan.

Untuk menguji fungsi penstriman, saya perlu mengakses pangkalan data yang mengandungi berjuta-juta rekod. Saya menggunakan imej docker https://www.php.cn/link/7092d5eb1bbca1a22bdc69ba3f517e68 untuk menggunakan data pekerja mysql

Selepas menyediakan imej docker, saya menghadapi masalah menyambungkan meja kerja mysql dengan pelayan. Nampaknya imej docker tidak dikonfigurasikan untuk menerima sambungan ssl secara lalai. Saya terpaksa melumpuhkan bendera use ssl untuk mewujudkan sambungan. Tetapan ini muncul dalam meja kerja mysql di bawah tab ssl.

Rentetan sambungan dalam aplikasi juga mesti dikonfigurasikan seperti berikut:

spring.datasource.url=jdbc:mysql://localhost:3307/employees?verifyservercertificate=false&usessl=false&requiressl=false

Data dalam pangkalan data pekerja terdiri daripada jadual bernama salaries yang mempunyai kira-kira 2.8 juta baris.

Untuk ujian, saya menulis aplikasi jpa data spring kecil yang mempunyai kaedah berikut dalam kelas repositori dan pengawal mudah untuk memanggil kaedah ini:

@Override
List<Salary> findAll();

@QueryHints(value = {
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE, value = "" + Integer.MIN_VALUE),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_CACHEABLE, value = "false"),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_READONLY, value = "true"),
})

@Query("SELECT s FROM Salary s")
Stream<Salary> findAllStream();

Saya kemudian menulis sekeping kod kecil yang menukar data baca menjadi objek json dan kemudian menulisnya kembali ke fail menggunakan berbilang benang. Ini adalah untuk mensimulasikan pemprosesan dalam kes kehidupan sebenar.

Ini yang saya perhatikan.

  • Penggunaan memori meningkat dengan ketara apabila menggunakan kaedah senarai. Pertanyaan awal mengambil sebahagian besar masa, tetapi setelah semua data dimuatkan, pemprosesan data sebenar selesai dengan cepat.

  • Apabila menggunakan kaedah strim, kesan ke atas penggunaan memori hampir tidak dapat dilihat. Tetapi secara keseluruhan, prestasi bahagian pemprosesan penyiapan adalah serupa atau lebih teruk berbanding kaedah senarai.

Kesimpulan

Penemuan saya di atas membawa saya untuk membuat kesimpulan bahawa pendekatan repositori ialah stream 返回类型仅应在存在内存不足风险时使用,即获得 out 内存异常 . Jika tidak, jika aplikasi anda sudah berjalan pada pelayan yang cukup besar, impak keseluruhan pada penggunaan memori akan hampir tidak ketara dan hanya akan sementara jika proses anda selesai dengan cepat.

Statistik penggunaan memori daripada intellij profiler

  • kiri -> apabila kaedah senarai berjalan
  • Betul -> Apabila kaedah strim berjalan

Atas ialah kandungan terperinci Cara memantau aliran JPA Spring Data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam