NHibernate’de ISession.Flush‘ı Anlamak: Ne Zaman ve Neden Kullanmalısınız

NHibernate ile çalışmak bazen bunaltıcı olabilir, özellikle ISession.Flush gibi işlevlerle. Birçok geliştirici, bu işlevin faydasını ve etkin uygulamasını anlamakta zorluk yaşıyor. Bu rehberde, session.Flushın ne olduğunu, ne zaman kullanılması gerektiğini ve veritabanı işlemlerini neden önem taşıdığını açacağız.

Temel Zorluk: Oturum Yönetimini Navigasyon

Sıklıkla NHibernate’deki üç kritik işlem arasındaki ilişki hakkında karışıklık yaşanır: Flush, Commit ve Close. Aşağıda kısa bir özet bulunmaktadır:

  • Flush: Bellekte yapılan değişikliklerle veritabanını günceller.
  • Commit: Bir işlemi tamamlar, tüm değişikliklerin onaylandığından veya bir hata durumunda geri alındığından emin olur.
  • Close: Oturumu sonlandırır ve herhangi bir bağlantıyı serbest bırakır.

Flush‘ı Commit ile birlikte ne zaman kullanacağınızı anlamak, etkili veri yönetimi için esastır.

ISession.Flush Ne Zaman Kullanılmalı

Flush‘ı etkili bir şekilde ne zaman kullanacağınıza karar vermenize yardımcı olacak basit bir kılavuz:

  1. Her Zaman İşlemler Kullanın: Veritabanı işlemlerinizi bir işlem içinde başlatın. Bu, hata yönetimi için kolay bir geri alma mekanizması sağlar.
  2. Doğrudan Close() Kullanımından Kaçının: Bunun yerine, ISession yaşam döngüsünü otomatik olarak yöneten using ifadelerini tercih edin. Bu, kaynak sızıntılarını önleyerek kodun okunabilirliğini artırır.

NHibernate Varsayılan Boşaltma Davranışı

NHibernate belgelerine göre, ISession‘ın boşaltılması birkaç senaryoda otomatik olarak gerçekleşir:

  • Find() veya Enumerable() yöntemlerinin belirli çağrılarında.
  • NHibernate.ITransaction.Commit() çağrıldığında; bu, işlemi bir harekette boşaltır ve onaylar.
  • ISession.Flush() çağrısıyla açıkça.

Boşaltma Uygulama Sırası

Bir boşaltma gerçekleştiğinde, NHibernate SQL ifadelerini şu sırayla yürütür:

  1. Tüm varlıklar için eklemeler (kaydedildikleri sırada).
  2. Tüm varlıklar için güncellemeler.
  3. Koleksiyonlar için silmeler.
  4. Koleksiyon elemanları için güncellemeler veya eklemeler.
  5. Son olarak, varlıkların silinmesi (silme çağrılarıyla ilgili sıraya göre).

Önemli Hususlar

  • İçsel vs. Dışsal Boşaltma: Eğer açıkça Flush() çağrısı yapmazsanız, oturum yürütmesinin ne zaman gerçekleşeceği konusunda herhangi bir garanti yoktur, sadece sıra vardır.
  • Boşaltma Modları: Oturumlarınız için FlushMode‘u üç modda yapılandırabilirsiniz: yalnızca onay sırasında boşalt, otomatik olarak boşalt veya belirli çağrılar yapılmadıkça asla boşaltma. Bu, özellikle uzun süreli işlemler için faydalıdır.

Boşaltma, Onaylama ve Kapatma Aşamaları

Bir oturumu sonlandırmak, belgelerde vurgulanan bu farklı aşamaları içerir:

  1. Oturumu Boşaltma: ITransaction API’sini kullanmıyorsanız, değişikliklerin veritabanıyla senkronize olmasını sağlamak için Flush() çağrısı yapın.
  2. İşlemi Onaylama: ITransaction API’sini kullanıyorsanız, bu otomatik olarak halledilir, aksi takdirde manuel olarak yapılması gerekir.
  3. Oturumu Kapatma: Bağlantıları düzgün bir şekilde serbest bırakmak için oturumlarınızı her zaman kapatın.

Kod Parçası Örnekleri

NHibernate ile bu aşamaları nasıl yönetebileceğinize dair örnek:

using (var session = sessionFactory.OpenSession())
{
    using (var transaction = session.BeginTransaction())
    {
        // Burada veritabanı işlemleriniz
        session.Flush(); // Değişikliklerin uygulandığından emin olun
        transaction.Commit(); // İşlemi onaylayın
    }
}

ADO.NET işlemleri doğrudan yönetiyorsanız:

session.Flush(); // Açıkça boşalt
currentTransaction.Commit(); // ADO.NET işlemini onayla

Sonuç: NHibernate Boşaltmasını Masterlama

ISession.Flush karmaşık görünebilir, ancak işlem yönetimiyle olan ilişkisini anlamak çok önemlidir. Her zaman işlemleri kullanmak, oturum kapatmayı düzgün yapmak ve ne zaman boşaltma yapacağınızı bilmek gibi en iyi uygulamalara uymak, NHibernate deneyiminizi daha kolay ve verimli hale getirecektir.

Bu makaledeki rehberliği takip ederek, veritabanı işlemlerinizi etkili bir şekilde yönetmek için daha iyi bir şekilde donanımlı olacaksınız ve veri bütünlüğünüz ile oturum verimliliğinizin her zaman yüksek kalmasını sağlayacaksınız.