Sebagaimana dijelaskan dalam posting forum ini , 1 dan 2 saling terkait. Jika Anda menetapkan hibernate.current_session_context_class
untuk utas dan kemudian menerapkan sesuatu seperti filter servlet yang membuka sesi - maka Anda dapat mengakses sesi itu di tempat lain dengan menggunakan SessionFactory.getCurrentSession()
.
SessionFactory.openSession()
selalu membuka sesi baru yang harus Anda tutup setelah Anda selesai dengan operasi. SessionFactory.getCurrentSession()
mengembalikan sesi terikat ke konteks - Anda tidak perlu menutup ini.
Jika Anda menggunakan Spring atau EJB untuk mengelola transaksi, Anda dapat mengonfigurasinya untuk membuka / menutup sesi bersama dengan transaksi.
Anda tidak boleh menggunakan one session per web app
- sesi bukan objek utas aman - tidak dapat dibagikan oleh banyak utas. Anda harus selalu menggunakan "satu sesi per permintaan" atau "satu sesi per transaksi"
openSession()
atauclose()
. Dia hanya menelepongetCurrentSession()
. Saya kira ia menetapkancurrent_session_context
untukthread
. Sekarang saya pikir saya mengertigetCurrentSession()
. Namun, saya tidak tahu kapan saya harus menggunakannyaopenSession()
.Sessions
. Bisakah Anda membantu saya dengan hal ini di - stackoverflow.com/questions/23351083/… . Terima kasih dan chenqui.Jika kita berbicara tentang SessionFactory.openSession ()
Dan Jika kita berbicara tentang SessionFactory.getCurrentSession ()
sumber
getCurrentSession
, itu akan menggunakan kembali sesssion yang sama, bukan?openSession
: Saat Anda meneleponSessionFactory.openSession
, ia selalu membuatSession
objek baru dan memberikannya kepada Anda.Anda perlu menyiram dan menutup objek sesi ini secara eksplisit.
Karena objek sesi tidak aman utas, Anda perlu membuat satu objek sesi per permintaan dalam lingkungan multi-utas dan satu sesi per permintaan dalam aplikasi web juga.
getCurrentSession
: Ketika Anda meneleponSessionFactory.getCurrentSession
, itu akan memberi Anda objek sesi yang dalam konteks hibernasi dan dikelola oleh hibernasi secara internal. Itu terikat pada ruang lingkup transaksi.Ketika Anda menelepon
SessionFactory.getCurrentSession
, itu membuat yang baruSession
jika tidak ada, jika tidak gunakan sesi yang sama yang ada dalam konteks hibernasi saat ini. Secara otomatis flushes dan menutup sesi ketika transaksi berakhir, jadi Anda tidak perlu melakukannya secara eksternal.Jika Anda menggunakan hibernasi dalam lingkungan berulir tunggal, Anda dapat menggunakannya
getCurrentSession
, karena kinerjanya lebih cepat dibandingkan dengan membuat sesi baru setiap kali.Anda perlu menambahkan properti berikut ke hibernate.cfg.xml untuk menggunakan
getCurrentSession
metode:sumber
sumber
SessionFactory: "Satu SessionFactory per aplikasi per DataBase" (mis., Jika Anda menggunakan 3 DataBase dalam aplikasi kami, Anda perlu membuat objek sessionFactory per setiap DB, benar-benar Anda perlu membuat 3 sessionFactory, atau jika Anda hanya memiliki satu DataBase One sessionfactory cukup ).
Sesi: "Satu sesi untuk satu siklus permintaan-respons". Anda dapat membuka sesi saat permintaan datang dan Anda dapat menutup sesi setelah proses permintaan selesai. Catatan: -Jangan gunakan satu sesi untuk aplikasi web.
sumber