Manajemen Sesi NHiernate di Asp.Net
Penulis:Eve Cole
Waktu Pembaruan:2009-06-30 16:46:38
Sesi di NHibernate sepertinya setara dengan koneksi database dalam pemahaman saya. Karena juga memiliki metode Open/Close, saya belum mempelajari source code NHibernate. Kira-kira apakah pemahaman ini salah? Saya banyak mencari tentang manajemen Sesi di Internet. Kebanyakan dari mereka adalah OpenSession() ketika saya membutuhkan operasi database, dan CloseSession() setelah operasi. ) objek Connection, lalu Close() setelah data diproses. Namun hal ini memiliki kelemahan, karena seringnya perpindahan Connection menghabiskan sumber daya sistem. Saya ingat ketika saya membuat antarmuka entri data sebelumnya, karena antarmuka entri ini memiliki banyak elemen data, dan banyak DropDownList yang diperlukan untuk membaca data dalam database dan mengikatnya.
Dengan cara ini, di Page_Load halaman, metode objek terkait perlu dipanggil satu per satu untuk mengambil DropDownList pengikatan data dari database. Karena metode objek kami menggunakan Koneksi independen, semuanya memilikinya sendiri Buka dan Tutup Koneksi. Oleh karena itu, dibutuhkan waktu lama untuk membuka halaman ini yang relatif lambat. Nanti, kami memproses data yang perlu diikat ke DropDownList menjadi DataSet, dan mengikat DataTable di DataSet ke DropDownList. Dengan cara ini, hanya diperlukan satu Buka/Tutup Koneksi halaman jauh lebih cepat.
Oleh karena itu, saya merasa cara pengelolaan Session di atas kurang tepat.
Kemudian, saya melihat manajemen Sesinya di proyek sumber terbuka Cuyahoga, dan dia menggunakan model "sesi per permintaan".
Pemahaman literalnya adalah membuat Sesi untuk setiap Permintaan hingga permintaan tersebut dimusnahkan, kemudian Sesi tersebut Ditutup.
Pendekatan Cuyahoga sedikit berbeda dari sesi per permintaan di mana ia membuat objek CoreRepository untuk setiap Permintaan. CoreRepository adalah kelas layanan pemrosesan data yang dibutuhkan oleh sistem.
Apa yang dia lakukan adalah membuat HttpModule (NHSessionModule) terlebih dahulu untuk membuat objek CoreRepository dan menghancurkan objek CoreRepository, sebagai berikut:
private void Context_BeginRequest(pengirim objek, EventArgs e)
{
// Buat repositori untuk objek Inti dan tambahkan ke HttpContext.
CoreRepository cr = CoreRepository baru(benar);
HttpContext.Current.Items.Add("CoreRepository", cr);
}
private void Context_EndRequest(pengirim objek, EventArgs e)
{
// Tutup sesi NHibernate.
if (HttpContext.Current.Items["CoreRepository"] != null)
{
CoreRepository cr = (CoreRepository)HttpContext.Current.Items["CoreRepository"];
cr.CloseSession();
}
}
Dengan cara ini, objek CoreRepository akan dibuat secara otomatis setiap kali permintaan dibuat. Ketika permintaan selesai, CloseSession() dapat digunakan untuk mendapatkan objek CoreRepository melalui HttpContext.Current.Items["CoreRepository"] dalam program.
Dengan cara ini, Sesi di NHibernate dikelola dalam bentuk terselubung, dan model "sesi per permintaan" tercapai.
Penjelasan mendetail: Inisialisasi Sesi Nhibernate dengan mengimplementasikan IHttpModule
Dibandingkan dengan metode di atas, yang memerlukan pembuatan Sesi untuk setiap operasi, metode ini seharusnya meningkatkan kinerja dan kecepatan secara signifikan.
Lalu saya berpikir, setiap permintaan membuat Sesi. Bisakah kita juga membuat Sesi Pool seperti Connection Pool?
Dengan cara ini, daripada membuat Sesi secara langsung setiap kali permintaan dibuat, Sesi yang sudah dibuat diambil dari Kumpulan Sesi kita. Bukankah ini lebih efisien? !
http://maplye.cnblogs.com/archive/2006/06/26/435683.html