Manfred Zerndl
Manfred Zerndl

Reputation: 11

Distribute transaction with Spring but without Hibernate

I try to do a global (distribute) transaction in Spring without Java EE (aplication server like JBoss) only with tomcat. There are two databases involved, the first is a PostgreSQL Database, the second is a MS SQLServer Database. Is there a way to do it without using hibernate?

I tried it with the atomikos API, but I don't know how to do it without a hibernate session. I think it would to great to do it JDBC-based or some other Tool that comes with Spring. But I don't know how to do it.

My Spring configuration looks like that:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xmlns:util="http://www.springframework.org/schema/util"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <!-- Get database driver XA properties from file -->
    <util:properties id="jdbcConfiguration1" location="classpath:jdbcconfiguration1.properties"/>
    <util:properties id="jdbcConfiguration2" location="classpath:jdbcconfiguration2.properties"/>

    <bean id="dataSourceA"
        class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
        <property name="uniqueResourceName"><value>XADBMS01</value></property>
        <property name="xaDataSourceClassName"><value>org.postgresql.xa.PGXADataSource</value></property>
        <property name="xaProperties" ref="jdbcConfiguration1"/>          
        <property name="poolSize"><value>1</value></property>
    </bean>

    <bean id="dataSourceB"
        class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">           
         ...
        <property name="poolSize"><value>1</value></property>
    </bean>    

    <!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->
    <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" 
          init-method="init" destroy-method="close">
        <!--  when close is called, should we force transactions to terminate or not? -->
        <property name="forceShutdown">
            <value>true</value>
        </property>
    </bean>

    <!-- Also use Atomikos UserTransactionImp, needed to configure Spring  --> 
    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
        <property name="transactionTimeout"><value>300</value></property>
    </bean>

    <!-- Configure the Spring framework to use JTA transactions from Atomikos -->
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager"><ref bean="atomikosTransactionManager"  /></property>
    <property name="userTransaction"><ref bean="atomikosUserTransaction"  /></property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

   ......

</beans>

Is it required to use Hibernate? I do not want to use hibernate, because i think it is do complicated for my needs. Is it possible to do that "Spring-based"?

Upvotes: 1

Views: 627

Answers (1)

axtavt
axtavt

Reputation: 242726

So, you have configured two DataSources and want to know how to use in a way consistent with JtaTransactionManager you declared.

Spring provides two options:

  • (Recommended) Use JdbcTemplate. Operations on JdbcTemplate automatically participate in the current transaction.

  • Use DataSourceUitls.getConnection() to obtain a Connection that's aware of the current transaction, and execute arbitrary JDBC operations on it.

In both cases you need to define transaction boundaries in your code using @Transactional or TransactionTemplate, as described in 11. Transaction Management.

Upvotes: 1

Related Questions