The WeakReference class, monitoring memory leak and garbage collection in a Java application

Image
 Below is a Stack implementation that uses an internal resizeable array structure.  public class MyStack< T > implements Stack< T > { private static final int CAPACITY = 100 ; private Object[] array ; private int pos = 0 ; public MyStack () { this . array = new Object[ CAPACITY ] ; } @Override public void push ( T item) { if ( pos >= array . length / 2 ) { Object[] newArray = new Object[ pos * 2 ] ; System. arraycopy ( array , 0 , newArray , 0 , array . length ) ; array = newArray ; } array [ pos ++] = item ; } @Override public T pop () { if (isEmpty()) { throw new RuntimeException( "empty stack" ) ; } @SuppressWarnings ( "unchecked" ) T item = ( T ) array [ pos - 1 ] ; pos -= 1 ; return item ; } @Override @SuppressWarnings ( "unchecked" ) public T peek...

Servis sınıfları ile "Transaction" yönetimi

Kurumsal uygulamalarda en önemli konulardan birisi de birbirinden ayrılamaz veritabanı işlemlerinin bir "transaction" içerisinde yapılmasının sağlanmasıdır. Çok katmanlı (layer) uygulamamızda bu işin yapılmasından hangi katman sorumlu olmalıdır? Diğer katmanların durumu nedir?

Yaygın olarak kullanılan "veri erişim nesnesi" (DAO) kalıbını kullandığımızı düşünelim. Bunların yer aldığı veri erişimi katmanı, transaction yönetiminden sorumlu olabilir. Fakat en çok kabul görmüş yöntemlerden birisi, transaction kontrolünün "service layer" denilen bir katmanda yapılmasıdır. Böyle bir yapıda gerçekleşen olaylar şöyle özetlenebilir:

1- Kullanıcı arayüzü katmanına ilişkin "controller" kodu, bir servis metodunu çağırır. Örnek:

class StudentController...

{
//...
studentService.addRegistration(...);

}

Görüldüğü gibi burada kullanıcı arayüzü kodu, sadece tek bir servis metodunu çağırmakta ve gerisine karışmamaktadır. Transaction kontrolünden sorumlu değildir.

2- Servis metodu, yapılacak işlemlerin bir transaction içerisinde atomik olarak yapılmasını sağlar. Bunu yaparken elbette kullanılan platformun transaction kontrolü mekanizmalarından faydalanır. Örneğin Spring çatısının transaction kontrol metotlarını kullanıyorsak:

class StudentService...

{
getTransactionTemplate().execute(new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult(TransactionStatus status) {
//...
getTransactionDao().makePersistent(transaction);

//...
}
});
}


Burada servis metodunun yaptığı şey, yapılan işlemi bir transaction içerisine almaktır. Kırmızı ile boyanmış kodda da gördüğümüz gibi burada veri erişim katmanına ait olan bir DAO sınıfının metodu çağrılıyor. Bu DAO sınıfının kodlarını incelediğimizde, transaction konusundan bihaber olduğunu görürüz. Yani DAO sınıfları veritabanı işlemlerini gerçekleştirirken, transaction içerisinde olunup olunmadığı ile ilgilenmiyorlar.

Çeşitli geliştirme çatılarının sunduğu transaction kontrolü seçeneklerini 2 gruba ayırabiliriz:
1- Programlama yoluyla (programmatic)
2- Bildirimsel olarak (declarative)

Bunlardan hangisini tercih ettiğimiz o kadar önemli değil. Asıl önemli olan, tüm uygulama kodlarının uyduğu bir transaction kontrol kuralının (veya tasarım kalıbının) benimsenmiş olmasıdır. Örneğin yukarıda anlattığımız yöntemde servis metotları sorumluluk almış. Böyle bir tasarım kalıbına "Servis tarafından sahiplenilmiş Transaction (Service Owned Transaction)" ismi verilebilir.

Comments

Popular posts from this blog

Trie Data Structure and Finding Patterns in a Collection of Words

My Crappy Looking Solution to "Binary Tree Common Ancestor" Problem

A Graph Application in Java: Using WordNet to Find Outcast Words