Ve neden?onu Nereye arabiriminin İSession Flush:
Beni iyice karıştı şeylerden biri* *6, session.Close
ile birlikte session.Flush
kullanılmasıdır.
Bazen session.Close
çalışır, örneğin, ben gereken tüm değişiklikleri kaydeder. Bir işlem var da dolaylı olarak kullanmam lazım biliyorum, ya da birkaç ile bir iş birimidir, eğer bir hata oluşursa geri almak için bir seçim yapmak için/güncellemeler/siler oluşturur.
Ama bazen gerçekten session.Flush
arkasındaki mantık bir gece olsun. session.SaveOrUpdate()
bir floş tarafından takip örnekler gördüm, ama ben Floş kaldırdığınızda zaten ince çalışır. Bazen zengin deyimi oturum zaman aşımına uğradı diyerek hata ile karşılaştım ve kaldırılması hata rastlamasaydım emin yaptı.
Herkes bir Floş kullanmak için nereye iyi bir kılavuz var mı? Bu Arabiriminin belgeleri kontrol ettim, ama yine de basit bir cevap bulamıyorum.
CEVAP
Kısaca:
- Her zaman hareketleri kullanın
Close()
,ISession
using
bir ifadeye ya . bir aramalarınızı sarmak yerine kullanmayın ^strong>senin İSession ömrü başka bir yerde yönetmek.
Zaman zaman
ISession
SQL ifadeleri nesneler bellekte tutulan devlet ile ADO.NET bağlantı durumu eşitlemek için gerekli yürütülür. Bu süreç, floş, aşağıdaki noktalarda varsayılan olarak oluşur
Find()
Enumerable()
bazı çağırmalarıNHibernate.ITransaction.Commit()
ISession.Flush()
SQL deyimlerini, aşağıdaki sırada düzenlenir
- tüm varlık, karşılık gelen nesneler kaydedilmiş aynı sırada
ISession.Save()
kullanarak eklemeler- tüm varlık güncellemeler
- tüm koleksiyonu silme
- tüm koleksiyon öğesi silme, güncellemeler ve eklemeler
- tüm koleksiyon eklemeler
- tüm varlık silmeler, aynı sırada karşılık gelen nesneler
ISession.Delete()
kullanılarak silindi(Bir istisna nesneleri yerli KİMLİĞİ oluşturma kullanılarak kaydedildiğinde eklenir.)
Zaman dışında explicity
Flush()
kesinlikle Oturumu ADO.NET aramalar yürütür hakkında garanti yok hayır, bunlar yürütüldüğü tek sipariş. Ancak,ISession.Find(..)
yöntemleri asla eski veri döndürecektir garanti Arabiriminin yapar; ne de yanlış veri ile iade edilir.Floş az görülür varsayılan davranışı değiştirmek mümkündür.
FlushMode
sınıfı tanımlar üç farklı mod: sadece flush de tamamlama süresi (ve yalnızca ArabirimininITransaction
API kullanılır), sifon otomatik olarak kullanarak açıkladı rutin, ya da hiç floş süreceFlush()
deniyor açıkça. Son modu uzunISession
açık tutulduğu çalışma birimlerinde çalışan ve uzun süre bağlantısız için yararlıdır.
...
Ayrıca this section bakın:
Dört ayrı aşamadan oluşur oturumu sonlandırmak için:
- oturum yıkayın
- hareketi tamamlamak
- oturumu kapatın
- özel durumları işlemek
Oturum kızarma
Eğer
ITransaction
API kullanarak olacak, bu adım hakkında endişelenmenize gerek yok. İşlem tamamlanmış olduğunda örtülü olarak yapılacaktır. Aksi takdirdeISession.Flush()
tüm değişiklikleri veritabanı ile senkronize olduğundan emin olmak için aramalısın.Veritabanı işlem yapılıyor
Eğer Arabiriminin ITransaction API kullanıyorsanız, bu gibi görünüyor:
tx.Commit(); // flush the session and commit the transaction
Eğer kendinizi ADO.NET işlemleri yönetmek eğer elle 30* *ADO.NET hareket etmelisiniz.
sess.Flush(); currentTransaction.Commit();
Eğer bir değişiklik yapmamaya karar verirseniz:
tx.Rollback(); // rollback the transaction
ya da:
currentTransaction.Rollback();
İşlem geri alma durumunda derhal kapatın ve Arabiriminin iç durum tutarlı olduğundan emin olmak için, geçerli oturum atmak gerekir.
Bu İSession kapanış
34 ** bir arama oturumu sona erdiğini gösteriyor. Kapat ana ima() ADO.NET bağlantı oturum tarafından görevinden ayrılmıştı.
tx.Commit(); sess.Close(); sess.Flush(); currentTransaction.Commit(); sess.Close();
Eğer kendi bağlantı sağladıysanız,
Close()
için bir başvuru verir, bu yüzden el ile kapatmak veya havuza iade edebilirsiniz. Aksi takdirdeClose()
havuza geri döner.
Nereye ve neden&; şablon" quot; ve...
Neden basit bir beşgen kullanmaktır bi...
ETMENİZ neden bu kadar hızlı NEREYE ba...
Neden sıralanmamış bir dizi daha hızlı...
Neden bu iki kez (1927) garip bir sonu...