Sansür, bir toplumun kendine olan güvensizliğini yansıtır ve otoriter rejimlerin belirgin bir özelliğidir.

--Potter Stewart

30.01.2008

Spring Veri Erişim Katmanı Desteği

1. Giriş


Veri erişim çatısını ayağa kaldırmak, bağlantı açmak, oluşabilecek çeşitli aykırı durumları ele almak ve açılan bağlantıyı kapatmak veri tabanına erişimi sağlayarak gerekli sorguyu çalıştırmak için yapılması gereken belli başlı adımlardır. Çeşitli veri tabanı erişim teknolojileriyle (JDBC, iBATIS, Hibernate, vb.) bütünleşik çalışan Spring erişim çatıları bu adımları soyutlayarak geliştiricinin işini kolaylaştırır. Alt düzey veri erişim görevlerini ele alarak geliştiricinin sadece veri yönetimiyle ilgilenmesine olanak sağlar.


Uygulamanın iş mantığınıyla bağımlılığı azaltmak için ayrı bir katman, veri yönetimini ele alır:




2. Spring Veri Erişim Mantığı


Veri tabanından okuma ve veri tabanına yazma işlemleri DAO (Data Access Objects) sınıfları aracılığıyla yapılır. DAO sınıflarıyla etkileşim DAO arayüzleri ile gerçekleştirilir. Bu yaklaşım sınıflar arası bağımlılığı azalttığı gibi uygulamanın test aşamasında herhangi bir veri erişim gerçekleştirimini kullanmadan, sahte (mock) gerçekleştirimlerle de test edilebilmesini sağlar. Ayrıca koda müdahaleyi en aza indirerek basit JDBC’den karmaşık JPA’ya kadar farklılaşan veri erişim teknolojileri arasında kolayca geçiş yapma olanağı sağlar:





2.1. Spring Veri Erişim Aykırı Durumları


Spring kullanılmadan, saf JDBC ile yazılan kodlarda oluşabilecek aykırı durumlar için sadece java.sql.SqlException zorunlu olarak ele almanız gerekir. Hata herhangi bir sebepten kaynaklanmış olabilir:


  • Uygulama veri tabanı ile erişim kuramamıştır.

  • İşletilen sorgu hatalar içermektedir.

  • Sorguda adı geçen tablo ya da kolon bulunmamaktadır.

  • Eklenmek veya günelenmek istenen veri, veri tabanı kısıtlarına uygun değildir.


Genellikle oluşabilecek hata bağlantı hatası olmasına karşın ortada bir belirsizlik söz konusudur. Spring’in sunduğu çeşitli aykırı durumlar hatanın kaynağına göre fırlatılarak söz konusu belirsizliği ortadan kaldırmaktadır. Ayrıca arka planda kullanılan veri erişim teknolojisine (JDBC, Hibernate, vs.) bağlı olmaksızın bu hatalar aynı şekilde fırlatılmaktadır. Oluşan hatayı ele almak zorunluluk olmaktan çıkarılıp geliştiricinin sorumluluğuna bırakılmıştır:




2.1.2. Veri Erişim Kalıpları(Templates)


Veri tabanıyla etkileşime başlamadan önce bağlantı açma ve işimiz bittiği zaman açılan bağlantıyı kapatma gibi adımlar söz konusudur. Bu adımlar veri ekleme, günleme, sorgulama, vb. farklılaşan işlemlerde hep sabittir.


Spring sabit ve farklılaşan işlemleri ele almak için Template tasarım örüntüsünden faydalanmıştır. Sabit bölümlerde transaction ve kaynak yönetimi ile aykırı durum ele alınırken farklılaşan bölümlerde sorgu deyimi hazırlama, parametre bağlanması ve geri dönüş kümesinin (result set) yönetimi yapılmıştır:



Seçilen veri erişim teknolojisine göre Spring’in sunduğu farklı kalıplar söz konusudur. Veri erişimi için JDBC kullanıyorsanız JdbcTemplate, nesne-ilişkisel eşleşimi (O2R) yapan bir çatı kullanıyorsanız HibernateTemplate veya JpaTemplate kullanımınıza sunulmuştur:



Kullandığınız veri erişimi teknolojisine göre seçtiğiniz kalıp sınıfı Spring bean olarak tanımlayıp uygulama ile veri erişim katmanının bağımlılığını azaltmak için kullandığınız DAO sınıflarınıza bağlamanız gerekmektedir.



2.1.3. DAO Destek Sınıfları


Spring, Template sınıfların yanı sıra Template sınıflarının yönetimini kolaylaştıran ve geliştiricinin, DAO sınıflarını kalıtabildiği DAO destek sınıfları sunmaktadır:



Herbir veri erişim teknolojisi için ayrı bir Template sınıfı sunan Spring herbir Template için de DAO destek sınıfı sunmaktadır:



2.2. Veri Kaynağı Tanımlama


Veri tabanına erişebilmek için öncelikli yapılması gereken bir veri kaynağı tanımlamaktır. Veri kaynağı tanımlamada şu seçeneklerden biri tercih edilebilir:


  • JDBC sürücüsü ile tanımlama

  • JNDI ile tanımlama (Uygulama bağımsız uygulama sunucusundan yönetilebilir.)

  • Bağlantı havuzu tanımlama

Oracle veri tabanı kullanan bir uygulamanın JDBC sürücüsü ile bir veri kaynağı şu şekilde tanımlanır:


<bean id="dataSource"

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="oracle.jdbc.OracleDriver" />

<property name="url"

value="jdbc:oracle:thin:@localhost:1555:test" />

<property name="username" value="admin" />

<property name="password" value="admin" />

</bean>



DriverManagerDataSource ile uygulamanın her bağlantı isteğine yeni bir bağlantı ile cevap verilir. Her bağlantı isteminde yeni bir bağlantı yaratma maliyetli bir işlemdir. SingleConnectionDataSource’da ise bağlantı isteklerine her zaman var olan tek bir bağlantı döndürülür. Bu yüzden multithread uygulamalar için uygun değildir. Geliştirme aşamasında bu tip veri kaynakları kullanılabilmesine rağmen uygulama gerçek kullanım ortamında söz konusu kısıtlar nedeniyle bağlantı havuzu mekanizmasını kullanmalıdır.


Bağlantı havuzu kullanan bir veri kaynağı şu şekilde tanımlanır:


<bean id="dataSource"

class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName" value="oracle.jdbc.OracleDriver" />

<property name="url"

value="jdbc:oracle:thin:@localhost:1555:test" />

<property name="username" value="admin" />

<property name="password" value="admin" />

<property name="initialSize" value="5" />

<property name="maxActive" value="10" />

</bean>


Burada bağlantı havuzu olarak Jakarta Commons Database Connection Pools (DBCP) projesi kullanılmıştır (http://jakarta.apache.org/commons/dbcp).


JdbcTemplate ile veri tabanına JDBC erişiminin nasıl yapılacağı bir diğer blog girdisinde anlatılacaktır.


Hiç yorum yok:

Yorum Gönder