Bir toplu işlemi gerçekleştirmeniz gerektiğinde ORM çerçevesinden vazgeçmeli misiniz?


15

İşte ortak bir durum:

  • ORM çerçevesi kullanan bir uygulamada toplu işlem gerçekleştirmeniz gerekir.
  • İlk geçişten sonra, önemli performans sorunları fark ettiniz.

İşte sorum:

  • Bu durumda, ham SQL içeren bir çözümü tercih etmelisiniz ?
  • Veya ORM çerçevelerinde toplu işlemlerle yaygın olarak ilişkili sorunları azaltmanıza yardımcı olabilecek iyi bilinen tasarım kalıpları var mı?

DÜZENLE:

  • ORM çerçevesini tüm uygulamadan kaldırmanız gerekip gerekmediğini sormuyorum.
  • Soruyorum: Uygulamanın bu küçük dilimi için ORM çerçevesinden vazgeçmeli misiniz?

Bir şey yapman gerekip gerekmediğini bilmiyorum , ama toplu operasyonunu harmanlamayı denedin mi?
ChrisAnnODell

Yanıtlar:


13

ORM'lerin veritabanınıza tamamen erişimi ele alması amaçlanmamıştır. Bunları, kendi başınıza yazmak için çok sıkıcı olan CRUD kodunun% 80'i için kullanın. Saklı yordamları, dinamik SQL'i veya dikkatle optimize edilmesi gereken kalan% 20 için istediğinizi kullanın.


4
Veritabanı soyutlaması bir ORM kullanmaya karar vermenizin temel nedenlerinden biri değilse bu işe yarayacaktır.

@ Pierre303, yorumunuzu anlamakta zorlanıyorum. Ne demek istiyorsun?
Mark Canlas

@MarkCanlas: Ben bunu yapmak isterseniz (örneğin SQL Server MySQL gidin) anlamında "veritabanı soyutlama" anlamına gelir düşünüyorum. Uygulamada, bu kullanım durumu neredeyse hiç meydana gelmez.
Robert Harvey

1
Yine de soyutlamalar oluşturabilirsiniz. Aslında birden çok sağlayıcıyı / lehçeyi destekleyen ORM'lerin çoğunda sağlayıcıya / lehçeye özgü kod desteği bulunur. Belirli veritabanları için toplu ekleme / dizi bağlama / TVP / gibi işlemler gerçekleştirebilir ve SQLite gibi desteklenmeyen sağlayıcılar için yavaş yavaş geri dönmesine izin verebilirsiniz. En kötü ihtimalle, yığın olabilir işlevselliğini ayrı bir arabirim / sınıf ve alt yapı veya yapılandırma parametrelerine dayalı farklı bir uygulamada ayırabilirsiniz.
Aaronaught

Evet, özel lehçeler ve belirli sorunlar için özel kod yardımcı olabilir. Bununla birlikte, bunun finansal bir bakış açısıyla uygulanabilir olması için, bunun katı minimumla sınırlı olması gerekir. Özelleştirme ile ilgili özel işlevlerimiz (lehçeler) toplam veri erişim kodu tabanının% 0.1'inden daha azını temsil eder. Bundan daha fazlası olsaydı gerçekten endişelendim.

7

Yüksek performans gerektiren ve milyarlarca kayıt işleyen bir uygulamada ORM (nHibernate) kullanıyorum. Zamanla, en önemli performans sorunlarının yalnızca ORM'den ziyade ORM'yi kullanma şeklimizle ilişkili olduğunu fark ettik.

ORM, zorunlu veritabanı bilginizin yerini almamalıdır. Kodunuzda daha fazla üretkenlik ve esneklik elde etmek için kullandığınız bir araçtır, ancak performansınızı optimize etmek için temel işlemleri bilmeniz gerekir.

Belirli bir ORM belirtmediniz, bu nedenle performansı artırmak için yaptığımız şeyler şunlardır:

  • Bir ORM profili oluşturduk. (nhprof kullandık)
  • Bir veritabanı profili kullanıyorduk. (SQL Server Profiler kullandık)
  • Konuyla ilgili olabildiğince çok makale okuyoruz. (Belgelerde konuyla ilgili tüm bölüme ek olarak nHibernate için birçoğu mevcuttu)
  • Performans ve ölçeklenebilirlik hakkında özel kitaplar aldık.
  • Kendi optimizasyonlarımızı test etmek için kıyaslama sistemi oluşturduk.
  • ve daha da önemlisi, kodumuzu gerçek verilerle büyük verilerle test edebildik. Bu son şey, uygulamamızdaki çoğu sorunu tespit etmemize yardımcı oldu.

1

Entity Framework ile yapmayı başardık, ancak uygulamamız çok sayıda toplu işlem gerçekleştirdi (bireysel tablolara çok sayıda kayıt yazardık), bu yüzden iyi bir uyum vardı. Sadece uygulamanızdaki özel amaçlı kod miktarını azaltmak için, mümkünse ORM çerçevesini korumanın mümkün olup olmadığını kesinlikle göreceğim. Yazmaları arabelleğe alıp bir grup olarak yürütmek mümkün müdür? İşlem semantiğini kaybedersiniz, ancak toplu işlemlerle devam ediyorsanız, bunu zaten kabul etmiş sayılırsınız.


1

ORM'ler büyülü bir şey yapmaz. Nesne erişim yöntemlerini SQL'e çevirirler. Yürüttükleri SQL deyimlerinin, elle yazacağınız SQL'den daha yavaş olması gerekmez. Bunu söyledikten sonra, rastlayabileceğiniz birkaç sorun var:

  1. İşlemler: Büyük bir toplu işlem, hep birlikte hep aynı şeyi yapan birçok küçük işlemden daha hızlıdır. Bu nedenle, ORM yöntem çağrılarınız ayrıntılı işlemler kullanıyorsa (örneğin Spring Roo varlıklarındaki etkin kayıt stili yöntemleri, varsayılan olarak @Tacacactional olarak açıklanır), toplu işlemler yavaş olur. Başvurunuzdaki durum buysa, işlem mantığınıza bakmalısınız.
  2. Önbellekleme: Hazırda Bekletme modunda, birinci düzey önbellek varlık yöneticinizin veritabanına gereksiz gidiş gelişlerden kaçınmasını sağlar. Genel olarak iyi bir şeydir, ancak gereksiz önbellek tıkanmasına neden olan ve uygulama performansının düşmesine neden olan toplu ekler için kötüdür. Sorununuz buysa, ChrisAnnODell tarafından önerilen Batching modeline bakmalısınız. İthalatçılarımızda kullanıyoruz ve toplu ekleri çok hızlandırıyor.

Performansı artırmak için yerel SQL kullanmanın yanlış bir yanı yoktur. Ama önce sizi neyin yavaşlattığını anladığınızdan emin olun.


Önbelleği önlemek için bir StatelessSession kullanın. Ayrıca, otomatik artış kimliklerinden kaçının. Bunun yerine HiLo veya Guid kullanılmalıdır.

1

ORM'yi atlayın. Sadece bu değil, aynı zamanda "normal" sql de bypass. Bir hazırlama tablosuna son derece büyük veri kümeleri eklemek için veritabanınızın bir toplu yardımcı programını kullanın. Ardından, hazırlama faaliyetlerinizi gerçekleştirmek için sql kullanın.

"Blog lezzeti" ORM'niz her durumda çalışmayabilir.


Doğru, bu tür arka uç araçları öğrenmek için bir güçlüktür, ancak yaklaşık 3 veya 4 kez sonra bir uzman olacaksınız ve işleri daha hızlı ve bazen başka şekillerde yapılamayan şeyler yapabilirsiniz. Bir kürek ve bir buldozer arasındaki fark gibidir. Çeşitli platformlar için metin giriş dosyalarını okumak ve verileri düşük seviyeli işlemlerle güncellemek için komut dosyası kontrollü araçlar yazdım. Böyle bir araç yazmak da hayatınızı kolaylaştırabilir (veya en azından daha ilginç). Bunun gibi şeyler, yazılım güncellemeleri sırasında istemci kurulumlarındaki özelleştirme verilerini değiştirmek için kullanılabilir.

0

O durumda. Bazen yapmak zorundasın.

Bazı ORM, geliştiricinin nesne modelini atlamasına ve doğrudan veritabanı katmanına gitmesine izin verir.

Nesne Odaklı olarak kapsüllenmiş toplu işlemleri kullanan ORM de vardır.


0

Umlcat tarafından belirtildiği gibi , toplu işlemleri kullanmanıza izin verecek bazı ORM'ler vardır.

Daha da iyisi, birçok ORM genişletilebilir, bu nedenle zaten desteklenmiyorsa toplu işlemleri çalıştırmak için kendi yönteminizi yazabilirsiniz. Uygulamanızdaki toplu işlem, dışarıda bırakabileceğiniz bir şeyse, ORM'de bir katman olarak eklerdim (bunu yapmak için muhtemelen ham SQL yazmanız gerekir), ancak uygulamada ORM'yi kullanın uyguladınız.

Bu aynı zamanda birim testi ve hata ayıklamayı kolaylaştırır. ORM yöntemleriniz için iyi bir test kapsamına sahip olduğunuzda, bunu uygulamalarınızda kullanmakta özgürsünüz. Aksi takdirde, ham SQL'de hata ayıklama (özellikle işlemler ve birçok JOIN içeren büyük olanlar) bir acı olabilir.

Bir zamanlar neredeyse 100 LOC olan ham SQL çağrısında bir hatayı tespit etmek neredeyse bir günümü aldı ve hata sadece tek bir karakterdi! O zamandan beri, uygulamada ham SQL'den kaçınmaya çalışıyorum ve tüm SQL prosedürlerini ayrı ayrı birim test ettirdim.


0

Fark ettiğim herhangi bir tasarım paterni yok. Benim tahminim, ORM için bir sebepten dolayı karar vermiş olmanızdır, bu nedenle ORM'den vazgeçmek istediğiniz şey değildir. Bununla birlikte, bu durumlarda her iki çözeltiyi karıştırmak için yer olduğunu düşünüyorum. Bunda bilinçli olarak yaptığınız ve yazılımınızda ORM'nin varsayılan kullanımından neden saptığınızı belgelediğiniz sürece bununla ilgili yanlış bir şey yoktur. Bunun yanında, bazı ORM çerçevelerinin toplu işlemler yapmak için bazı olanakları vardır. NHibernate'in (.NET çerçevesi için ORM) çok daha az yükü olan StatelessSessions'ı geliştirdiğini biliyorum, ancak bu hala aradığınız performans artışı vermeyebilir. Bu durumda, sadece ham SQL kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.