Hibernate Open Sesi dalam Pandangan: Amalan Kontroversi
Pengenalan
Sesi Terbuka Dalam Pandangan (OSIV) ialah ciri Hibernate yang membenarkan sesi Hibernate kekal terbuka semasa permintaan-tindak balas kitaran. Amalan ini telah menjadi topik perdebatan dalam komuniti Java, dengan sesetengahnya menyokong untuk kemudahannya manakala yang lain mempersoalkan kelemahannya.
Isu dengan OSIV
OSIV mengemukakan beberapa cabaran :
-
Pengendalian Transaksi Tidak Konsisten: OSIV memastikan sesi dibuka selama-lamanya, memintas kitaran hayat transaksi biasa. Ini boleh membawa kepada akibat yang tidak diingini, seperti isu ketekalan data.
-
Kemerosotan Prestasi Pangkalan Data: Memastikan sesi terbuka memberi tekanan pada pangkalan data, kerana sebarang pernyataan tambahan yang dilaksanakan semasa pemprosesan respons (cth. , permulaan persatuan malas) dikeluarkan dalam mod autokomit.
-
Lapisan Kabur Pemisahan: OSIV mengaburkan pemisahan kebimbangan antara lapisan perniagaan dan fasa pemaparan UI, menjadikannya sukar untuk menguji dan mengekalkan aplikasi.
-
Meningkatkan Masa Pajakan Sambungan: Sesi boleh diadakan terbuka untuk tempoh yang panjang, mengehadkan kumpulan sambungan pangkalan data sumber.
Strategi Alternatif
Untuk mengelakkan isu ini, pembangun boleh menggunakan strategi alternatif:
-
Memulakan Secara Eksplisit Persatuan Malas: Mulakan persatuan malas dalam lapisan perkhidmatan menggunakan Sertai Ambil atau FetchMode.SUBSELECT.
-
Buat Pertanyaan DAO Berasingan: Tulis pertanyaan DAO khusus untuk lapisan UI yang disesuaikan untuk mengambil hanya perkaitan yang diperlukan.
-
Gunakan Paparan Unjuran: Buat unjuran yang hanya mengembalikan medan penting yang diperlukan untuk UI dan bukannya lengkap entiti.
-
Gunakan FetchMode.LAZY dan EAGER Memuat: Konfigurasikan FetchMode.LAZY untuk entiti yang tidak diperlukan serta-merta dan FetchMode.EAGER untuk persatuan yang mesti dimuatkan terlebih dahulu.
Melumpuhkan OSIV pada Musim Bunga But
Spring Boot mendayakan OSIV secara lalai. Untuk melumpuhkannya, tetapkan sifat berikut dalam fail application.properties:
spring.jpa.open-in-view=false
Salin selepas log masuk
Tetapan ini memastikan sesi Hibernate ditutup selepas setiap transaksi lapisan perkhidmatan, menghalang potensi kelemahan yang dikaitkan dengan OSIV.
Atas ialah kandungan terperinci Sesi Terbuka Hibernate dalam Paparan: Untuk Digunakan atau Tidak Digunakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!