IServerContext kullanarak veri tabanı işlemleri yapmak için IServerContext üzerinden alınan IObjectFactory ve IQueryFactory arayüzleri kullanılır. Bu arayüzlerle istemcide olduğu gibi her türlü nesne okuma-kaydetme, sorgu çalıştırma işlemleri yapılabilir. Bu standart işlemlere ek olarak sunucu tarafında veri tabanı transaction yönetimi yapılabilir. IObjectFactory ve IQueryFactory üzerindeki her metod devam eden bir transaction bulunmuyorsa yeni bir transaction açar ve işlemin durumuna göre commit ya da rollback yaparlar. Eğer sunucu tarafında birden çok veri tabanı işleminin aynı transaction içinde yapılması ihtiyacı varsa IObjectFactory veya IQueryFactory üzerinden bunu yapmak mümkün değildir. Örneğin bir toplu işlemde ya da bir sunucu servisinde birkaç nesne kaydetme ve bazı güncelleme ve silme sorgularının çalışması işlemlerinin tamamının tek transaction içinde yapılması gerekebilir. Bu tür durumlarda IServerContext üzerinde bulunan execute metodlarından biri kullanılır. IServerContext üzerinde ürün geliştirme kullanımı için yazılmış iki tane execute metodu bulunur:

AtomicOperationResult execute(IAtomicOperation operation) throws AtomicException;

AtomicOperationResult execute(IAtomicOperation operation, int executionMode) throws AtomicException;

Bu metodlardan birincisi en sık kullanılanılacak olanıdır ve parametre olarak aldığı arayüz tarafından gerçekleştirilen işlemlerin tamamının tek bir transaction içinde gerçekleşmesini sağlar. Parametre olarak aldığı IAtomicOperation arayüzü basit bir tanıma sahiptir:

public interface IAtomicOperation
{
      public Object execute(IServerContext context) throws AtomicException, Exception;
}

Bu arayüz üzerindeki tek metod olan execute metodundan beklenen tek bir transaction içinde gerçekleşmesi gerekli işlemleri yapması ve dönülecek bir nesne varsa bu nesneyi dönmesidir. Bu metod ihtiyacı olabilecek olan IServerContexr nesnesini parametre olarak alır. Metod tarafından atılan her Exception yürümekte olan transaction'ın rollback edilmesine sebep olur. Atılan Exception'lardan türü AtomicException olan exception'ların ayrı bir anlamı bulunur. Bu metod içinden atılan tüm exception'lar IServerContext arayüzünü gerçekleştiren sınıf tarafından yakalanır. Eğer bu işlem sonucu IServerContext dışına bir Exception atılmak isteniyorsa bu Exception bir AtomicException içinde atılır. IServerContext arayüzünü gerçekleştiren sınıf yakaladığı exception AtomicException ise bu exception'ı dışarı atar. Böylece IServerContext'in execute metodunu çağıran nokta içten atılan exception'a erişme olanağı bulur. Bu kullanıma örnek aşağıda gösterilmiştir:

public class SampleClass
{
   public boolean doSomethingInTransaction(IServerContext serverContext, final BusinessObject item) throws MyCustomException
      {
            try
            {

       AtomicOperationResult result = serverContext.execute(new AtomicOperation("SampleClass.doSomethingInTransaction")
                  {

                 public Object execute(IServerContext context) throws AtomicException, Exception
                        {
                             if (item = = null)

                   throw new AtomicException(new MyCustomException("Cannot operate on null object!"));
                             IObjectFactory objFactory = context.getObjectFactory();
                             objFactory.persist(item, null);
                             IQueryFactory qryFactory = context.getQueryFactory();
                             qryFactory.executeServiceQuery("SomeUpdateQuery", null);
                             qryFactory.executeServiceQuery("SomeDeleteQuery", null);
                             return new Boolean(true);
                        }
                  });
                  Boolean returnVal = (Boolean) result.getResult();
                  return returnVal.booleanValue();
            }

            catch (AtomicException e)
            {
                  Exception inner = e.getInnerException();
            if (inner instanceof MyCustomException)
                   throw (MyCustomException) inner;
            }
            return false
      }

      class MyCustomException extends Exception
      {
       private static final long serialVersionUID = 1L;

        protected MyCustomException()
            {
                  super();
            }

        protected MyCustomException(String message)
            {
                  super(message);
            }
      }
}

Telif HakkıKullanım KoşullarıGizlilik
Copyright © 2018 Logo Yazılım