Transactional unit test over multiple datasources

Recently I needed to write an integration test that covered a transaction over multiple SessionFactories and different datasources. I wanted it to be an outside-the-container-test and therefor I needed some ability to do transactions over multiple datasources without all the stuff a J2EE container would provide.
A good start for writing transactional tests can be found, as usual, in Spring. All you need to do is to extend the AbstractTransactionSpringContextTests class and the rest is a piece of cake. Now the question is how to wire this up for multiple datasources?

To start we need some transaction manager and datasources that support XA transactions to use in my test. Thanks to my collegue Maarten Winkels I came across this excellent post on javaeye.com which gives an example on how to configure Spring, Hibernate and JOTM. JOTM is an open source transaction manager written in Java. Spring also provides support for using JOTM through the JotmFactoryBean.
Interestingly the class created by the JotmFactoryBean, the Jotm class, is used for exposing both the UserTransaction as the TransactionManager so regarding the transaction part we are done.

Now all we need is a XA compliant datasource. In both the Spring docs of the JotmFactoryBean and the post on javaeye.com the XAPool is used. Now to wire this all together in Spring xml you have to define something like this (assuming you need two datasources):

    
    
        
        
        
    
    
        
        
        
    


    
        
        
        
    
    
        
        
        
      

    

    
        
            
        
        
            WEB-INF/hibernate-cfg-1.xml
        
        
            org.hibernate.cfg.AnnotationConfiguration
        
        
            
                org.hibernate.dialect.PostgreSQLDialect
            
        
    

    
        
            
        
        
            WEB-INF/hibernate-cfg-2.xml
        
        
            org.hibernate.cfg.AnnotationConfiguration
        
        
            
                org.hibernate.dialect.PostgreSQLDialect
            
        
    

    
    

    
        

And for the maven users, all dependencies are in the maven repository so just add the following dependencies to your pom and off you go!

        
            jotm
            jotm
            2.0.10
        
        
            com.experlog
            xapool
            1.5.0
        

Have fun!

Comments (2)

  1. Guy - Reply

    August 27, 2007 at 12:10 pm

    Hi,

    Nice! BTW you can also substitute JOTM with Atomikos: http://www.atomikos.com/products.html

    Best
    Guy

  2. Prasanna - Reply

    April 20, 2009 at 4:09 pm

    Have you worked on Coherence (cache)? I would like to treat Coherence as one data source and my database as another data source, and I would like these two to be present in one XA transaction. Any idea how this could be accomplished?

    Many thanks!

Add a Comment