2009-02-18 37 views
7

Merhaba Bir günde birkaç xml dosyası işlemek ve bu dosyalarda bulunan bilgileri içeren bir Veritabanını doldurmamız gereken bir proje üzerinde çalışıyorum.NHibernate toplu ekleme veya güncelleştirme

Her dosya yaklaşık 1 MB'dir ve yaklaşık 1000 kayıt içerir; Bu dosyaların genellikle 12 ve 25'i arasında işlem yapmamız gerekir. NHibernate kullanarak toplu ekler ile ilgili bazı bilgiler gördüm ama xml dosyaları güncellenmiş kayıtlarla karıştırılmış yeni kayıtlar içerdiğinden problemimiz bir şekilde daha zor.

xml'de, bize belirli bir kayıt olan yeni bir kayıt veya varolan bir kaydın güncelleştirilmesi olduğunu bildiren bir bayrak vardır, ancak hangi bilgilerin değişmediğini belirtir. Xml kayıtları DB tanımlayıcımızı içermez, ancak DB'deki bir kaydı benzersiz bir şekilde bulmak için xml kayıtlarından bir tanımlayıcı kullanabiliriz.

Şu ana kadarki stratejimiz, şu anki kaydın bir ek mi yoksa bir güncelleme mi olduğunu ve DB üzerinde bir ekleme yaptığımızı mı yoksa bir arama yaptığımızı mı, yoksa bu bilgileri nesne ile güncellediğimizi belirlemekti. xml kaydından gelen bilgiler ve son olarak DB'de bir güncelleme yapıyoruz.

Güncel yaklaşımımızın sorunu, DB kilitleri ile ilgili sorunlar yaşadığımız ve performansımızın gerçekten hızlı düştüğü sorunudur. Ayrı operasyonlar için ayrı tablolar, hatta DB'lerin ayrı olması gibi bazı alternatifler üzerinde düşünmüştük, ancak böyle bir hamle yapmak büyük bir çaba anlamına gelecektir. Bu nedenle, herhangi bir karardan önce, bu konudaki toplum fikrini sormak istiyorum, şimdiden teşekkürler.

cevap

17

fikirlerin bir çift:

  • daima toplu işlemler için IStatelessSession kullanmayı deneyin. Hala performans değil mutluysan
  • , sadece NHibernate atlamak ve buna özgü bir saklı yordam veya parametreli sorgu kullanabilir veya SQL Server kullanıyorsanız IQuery.ExecuteUpdate()
  • kullanın Size xml formatını dönüştürebilirsiniz BCPFORMAT xml daha sonra üzerinde BULK INSERT komutunu çalıştırın (yalnızca ekler için)
  • Çok fazla DB kilitleme yapıyorsanız, işlemleri gruplandırmayı deneyin (ilk önce neyin eklenmesi gerektiğini ve ne güncellendiğini öğrenin, sonra güncellemeler için PK'leri alın) ve sonra ekleme için BULK INSERT çalıştırın, sonra güncelleştirmeleri çalıştırın)
  • Kaynak dosyaları ayrıştırma bir performans sorunu (yani, bir CPU çekirdeği maksimuma çıkar) ise, paralel olarak yapmayı deneyin (kullanabilirsiniz 210)
İlgili konular