2009-03-08 16 views
3

Bir süre önce hangi yöntemlerin işlemsel olduğunu tanımlamak için Spring AOP kullanılan bir uygulama yazdım. Şimdi bunun ne kadar iyi bir fikrin olduğuna dair ikinci düşüncelerim var; Küçük bir refakatçiden (değişim metotları vb.) Sonra birkaç kez vuruldum, ki bu da aslında bir şeyler ters gidinceye kadar (ve mantıksal olarak tutarsız bir veri tabanına sahip olacağım) elbette belirginleşmiyor.Veritabanı işlem yönetimi için AOP kullanıyor musunuz?

Bu yüzden bir kaç şey ilgileniyorum:

  1. kişi açık işlem yönetimine dönmek (örn @Transactional ek açıklamalar yoluyla) karar mı?
  2. Bir şeyin "bozuk" olup olmadığını belirlemek için bir oluşturma işleminin parçası olarak kullanabileceğim yararlı araçlar var mı?
  3. Kullanıcılar işlemleri yönetmek için AOP kullanıyorsa, yaptığım hataları önlemek için ne gibi adımlar atıyorlar?

Sana dekore yöntemleri göz ve yöntem adı değişikliklerle XML yapılandırma birlikte bahar planı ayrı olacak verir IntelliJ IDEA kullanıyorum, ancak bu etkileyebilir yanlış yerde bir yönteme bir parametre ekleyerek (her zaman yeterli değildir Örneğin, bir özelliğin nasıl tetiklediği)

cevap

4

Şu anda çalışmakta olduğum iki Java projesinde bildirimsel işlem yönetimi kullanıyorum, hangi yöntemlerin @Transactional ek açıklaması ile işlem kapsamına ihtiyacı olduğunu belirliyorum. Benim düşünceme göre, esneklik ve sağlamlığın iyi bir karışımıdır: basit bir metin aramasıyla hangi yöntemlerin işlemsel davranışa sahip olduğunu görebiliyorsunuz, ihtiyaç duyulduğunda izolasyon ve yayılma özelliklerini el ile ayarlayabilir ve ek yazım miktarı neredeyse ihmalkardır. .

Bu projelerden birinde, güvenlik/günlüğe kaydetme özelliklerinden yola çıktım ve bazen bir yöntemi yeniden adlandırırken veya imzaları değiştirirken aynı engellerle karşılaştım. En kötü durumda, kullanıcı sözleşmelerinden yararlanan bazı günlük verilerini kaybettim ve bir sürümde bazı kullanıcı rolleri tüm uygulama özelliklerine erişemedi. Büyük bir şey değil, ama, veritabanı işlemleri kadar gitmek, ama, ben buna değmez düşünüyorum, ve ben @Transactional bit kendiniz yazmak daha iyidir. Yine de bahar zor kısmı yapıyor.

+0

+1 - İlkbahar 2.5'deki ek açıklamaların kullanılması iyi bir öğüt. – duffymo

+0

Aslında bunu yapmadım sebebi, bireysel ısrar çağrılarının aksine işlemsel olması gereken iş mantığıdır.Bahar ithalatının her yerde olmasını istemedim - Kalıcılık uygulama detaylarının mümkün olduğunca izole edilmesini istedim. –

+0

Doğru, bu nedenle @Transaction ek açıklamaları kalıcılık katmanı değil, hizmet katmanına ait. İşlemler, hizmetlerle temsil edilen kullanım durumları ile ilgili birimlerdir. – duffymo

0

Daha çok bir bakıcı olmaya eğilimliyim, ancak her türlü işlem yönetimini veritabanının kendisinde bulunan basit bir otomatik katılımın ötesinde tutmaya çalışıyorum. Çoğu veri tabanı, işlem yönetimini ele almada mükemmeldir, her şeyden önce, bir veritabanının ne anlama geldiğinin temel bileşenlerinden biridir.

+0

Veritabanı hala bunu yapıyor. Bu düzenlemeyle iki aşamalı taahhüdü nasıl yönetiyorsunuz? Tüm oyuncuları bilen 3. parti olmalı ve bu da orta kademe işlem yöneticisi. – duffymo

+0

Tam olarak - bunu doğru şekilde yapmanın tek yolu, iş mantığını veritabanına taşımaktır. Örneğin, ekleme işlemi/güncelleme hesabı "birlikte" olmalıdır, aksi halde atomizasyon sorunları ile sonuçlanırsınız. –

+1

İki aşamalı bir işlemden bahsetmediniz. Siz basit, iki aşamalı bir işlemden çok daha kolay olan veritabanı işlem yönetimi söz konusu. 2PC'ye ihtiyacınız varsa, Spring'in @Transactional da size yardımcı olmaz. – Nick

2

(1) ile ilgili olarak: @Transactonal, son birkaç yılda üzerinde çalışılan tüm projelerde daha pratik bir çözüm buldum. Bununla birlikte, bazı çok özel durumlarda, birden fazla JDBC bağlantısı/TransactionManager kullanımına izin vermek için Spring AOP'yi kullanmam gerekiyordu, çünkü @Transaction tek bir işlem yöneticisine bağlı.

(2) ile ilgili olarak: Karışık bir senaryoda, muhtemelen bozuk kodu bulmak için çok fazla otomatik test yapıyorum. Testlerimi oluşturmak için Spring'in AbstractTransactionalJUnit4SpringContextTests/AbstractTransactionalTestNGSpringContextTests kullanıyorum. Şimdiye kadar çok etkili bir çözüm oldu.

İlgili konular