Seam İle Birden Fazla Veribanına Erişim

Seam Birden Fazla Veritabanı Erişimi

Seam ile iki veya daha fazla veritabanına bağlanmak isterseniz aşağıda bununla ilgili bir örnek bulunmakta. Burada kullandığınız veritabanları Oracle ve MySql gibi farklı veritabanları da olabilir.

Öncelikle container taraflı bir connection kullandığımdan projeAdi-ds.xml dosyasın içerisinde veri kaynağını aşağıdaki gibi iki tane olarak tanımlıyoruz.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE datasources
       PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
       "http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
    <datasources>
       
       <local-tx-datasource>
          <jndi-name>birdenFazlaVeriKaynagiBirDatasource</jndi-name>
          <use-java-context>true</use-java-context>
          <connection-url>jdbc:mysql://localhost:3306/ornek_db_1</connection-url>
          <driver-class>com.mysql.jdbc.Driver</driver-class>
          <user-name>root</user-name>
          <password>root</password>
       </local-tx-datasource>
       
       <local-tx-datasource>
          <jndi-name>birdenFazlaVeriKaynagiIkiDatasource</jndi-name>
          <use-java-context>true</use-java-context>
          <connection-url>jdbc:mysql://localhost:3306/ornek_db_2</connection-url>
          <driver-class>com.mysql.jdbc.Driver</driver-class>
          <user-name>root</user-name>
          <password>root</password>
       </local-tx-datasource>
       
    </datasources>

Şimdi persistence.xml içerisine girip burada persistence-unit tanımlarını yapıyoruz. Bu sayede JPA üzerinde ikinci bir persistence kaynağımız oluyor.

    <?xml version="1.0" encoding="UTF-8"?>
    <!– Persistence deployment descriptor for dev profile –>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
     version="1.0">
     
     <persistence-unit name="birdenFazlaVeriKaynagiBir"
      transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:/birdenFazlaVeriKaynagiBirDatasource</jta-data-source>
      <properties>
       <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
       <property name="hibernate.hbm2ddl.auto" value="update" />
       <property name="hibernate.show_sql" value="true" />
       <property name="hibernate.format_sql" value="true" />
       <!– Only relevant if Seam is loading the persistence unit (Java SE bootstrap) –>
       <property name="hibernate.transaction.manager_lookup_class"
        value="org.hibernate.transaction.JBossTransactionManagerLookup" />
      </properties>
     </persistence-unit>
     
     <persistence-unit name="birdenFazlaVeriKaynagiIki"
      transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:/birdenFazlaVeriKaynagiIkiDatasource</jta-data-source>
      <properties>
       <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
       <property name="hibernate.hbm2ddl.auto" value="update" />
       <property name="hibernate.show_sql" value="true" />
       <property name="hibernate.format_sql" value="true" />
       <!– Only relevant if Seam is loading the persistence unit (Java SE bootstrap) –>
       <property name="hibernate.transaction.manager_lookup_class"
        value="org.hibernate.transaction.JBossTransactionManagerLookup" />
      </properties>
     </persistence-unit>
     
    </persistence>

Son olarak components.xml içerisinde Seam in kullanması için aşağıdaki gibi persistence context tanımlarını ekliyoruz.

     
    <persistence:entity-manager-factory name="entityManagerFactoryBir" persistence-unit-name="birdenFazlaVeriKaynagiBir" />
    <persistence:managed-persistence-context auto-create="true" entity-manager-factory="#{entityManagerFactoryBir}" name="entityManager" />
     
     
    <persistence:entity-manager-factory name="entityManagerFactoryIki" persistence-unit-name="birdenFazlaVeriKaynagiIki" />
    <persistence:managed-persistence-context auto-create="true" entity-manager-factory="#{entityManagerFactoryIki}" name="entityManagerIki" />

Bu durumda artık Seam içerisinde birden fazla veri kaynağına erişebiliyor olacağız.
Örneğin aşağıda iki ayrı veritabanına iki ayrı kayıt ekliyorum. Yanlız dikkat ettiyseniz ikinci EntityManager nesnesini entityManagerIki olarak tanımladım. Bunun nedeni Seam components.xml içerisinde olan persistence tanımlarını context üzerinde bu isimle bulundurur. Bu yüzden bu isimle inject etmemiz gerekli.

    @In EntityManager entityManager;
    @In EntityManager entityManagerIki;
       
    public void kaydet() {
         Kayit kayit = new Kayit();
         kayit.setAd("Melih");
         kayit.setNo(123);
         entityManager.persist(kayit);
         
         Kayit kayit2 = new Kayit();
         kayit2.setAd("Ahmet");
         kayit2.setNo(124);
         entityManagerIki.persist(kayit2);
         
    }

Bunlar haricinde eğer yukarıdaki gibi iki operasyon tek transaction içerisindeyse aşağıdaki gibi bir hata alabilirsiniz.

javax.ejb.TransactionRolledbackLocalException: Could not enlist in transaction on entering meta-aware object!; – nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: a010f17:c1e:4db79191:23c4fa status: ActionStatus.ABORT_ONLY >); – nested throwable: (org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object!; – nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: a010f17:c1e:4db79191:23c4fa status: ActionStatus.ABORT_ONLY >))

Bu durumda JBoss_Home/server/all/conf/ altındaki jbossjta-properties.xml dosyası içerisinde satırının hemen altına aşağıdaki satırı ekleyin.

    <property name="com.arjuna.ats.jta.allowMultipleLastResources" value="true"/>

Umarım faydalı bir yazı olmuştur :)

  1. ilkmurat
    Jul 30th, 2011 at 23:27 | #1

    Hocam ben böyle bir yapı kullanmıştım hibernate ile.. Birden çok veritabanına bağlanabiliyorduk ama aynı değil. Kullandığımızı aktif yapıp diğer veritabanlarını pasif yapıyorduk. Burda aynı anda hepsine bağlanmak mümkün mü ?

  2. Jul 31st, 2011 at 07:03 | #2

    Bu ornekte hepsine ayni anda baglaniyor. Hatta container üzerindeki JTA ile transaction ları birlikte yönetiyor.

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>