Spring+Hibernate多数据源整合

在一个项目中,可能用到不止一个数据库,这个时候就需要用Hibernate配置多数据源
接上一篇文章:此处在上一篇文章中做一些修改
第一步:修改applicationContext.xml文件、配置多个dataSource.并且配置每个dataSource相对应的sessionFactory,还要配置sessionFactory对应的 transactionManager

修改之后的applicationContext文件如下:





      


      
      
             
             
             
             
             
             
             
             
      

      
      
             
             
             
             
             
             
             
             
      



      
      
             
             
                   
                         ${hibernate.dialect} 
                         ${hibernate.show_sql} 
                         ${hibernate.generate_statistics} 
                   
             
             
                   
                         
                               
                         
                   
             
             
             
      


      
      
             
             
                   
                         ${hibernate.dialect} 
                         ${hibernate.show_sql} 
                         ${hibernate.generate_statistics} 
                   
             
             
                   
                         
                               
                         
                   
             
             
             
      


      
      
            
      

      

      



第二步:在dao包下新建两个DaoSupport,一个用来连接datasource1的,一个用来连接datasource2的。并且在类中配置他们的sessionFactory和datasource

import javax.sql.DataSource;

import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class MacDaoSupport extends JdbcDaoSupport {
     protected Logger logger = LoggerFactory.getLogger(this.getClass());
     @Qualifier("sessionFactory")
     SessionFactory sessionFactory;

     protected HibernateDaoSupport hbSupport;

     /**
      * 自动注入数据源并指定为"dataSource" 
* 子类可重写该方法通过 @Qualifier("dataSource") 注解指定其它数据源
* */ @Autowired() public void initJdbc( @Qualifier( "dataSource1") DataSource dataSource) { super.setDataSource(dataSource); } /** * 自动注入会话工厂并指定为"sessionFactory"
* 子类可重写该方法通过 @Qualifier("sessionFactory") 注解指定其它会话工厂
* */ @Autowired() public void initHbernate( @Qualifier( "sessionFactory") SessionFactory sessionFactory) { hbSupport = new HibernateDaoSupport() { }; hbSupport.setSessionFactory(sessionFactory); } public HibernateTemplate getHbernateTemplate() { return hbSupport.getHibernateTemplate(); } }


import javax.sql.DataSource;

import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class PartnerDaoSupport extends JdbcDaoSupport {
     protected Logger logger = LoggerFactory.getLogger(this.getClass());
     @Qualifier("sessionFactoryPartner")
     SessionFactory sessionFactory;

     protected HibernateDaoSupport hbSupport;

     /**
      * 自动注入数据源并指定为"dataSource" 
* 子类可重写该方法通过 @Qualifier("dataSource") 注解指定其它数据源
* */ @Autowired() public void initJdbc( @Qualifier( "dataSource2") DataSource dataSource) { super.setDataSource(dataSource); setDataSource(dataSource); } /** * 自动注入会话工厂并指定为"sessionFactory"
* 子类可重写该方法通过 @Qualifier("sessionFactory") 注解指定其它会话工厂
* */ @Autowired() public void initHbernate( @Qualifier( "sessionFactoryPartner") SessionFactory sessionFactory) { hbSupport = new HibernateDaoSupport() { }; hbSupport.setSessionFactory(sessionFactory); } public HibernateTemplate getHbernateTemplate() { return hbSupport.getHibernateTemplate(); } }



第三步:使用方法
对于不同的XXXXServiceImpl类,如果AServiceImpl里面的方法全部都是访问dataSource1的数据库。 那就将该类继承 MacDaoSupport(该类配置了datasource的来源是datasource1,就是ApplicationContext中的datasource1)
相同,如果是BserviceImpl里面的方法全部是访问dataSource2的数据库,就继承  PartnerDaoSupport  
那么问题来了,如果 AServiceImpl既要访问 dataSource1的数据库,又要访问 dataSource2的数据库.怎么办?
昨天下午弄了半天. 利用动态切换数据库来实行,但是一个下午没弄出来。请教了几个java的同事,
他们的做法是: AServiceImpl里面的方法全部必须访问的数据源是同一个! 也就是说:有几个数据源,就有几个XXXDaoSupport


这是访问数据库100msh_mac的(datasource1)
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.bmsh.router.assistant.dao.MacDaoSupport;
import com.bmsh.router.assistant.entity.Machine;
import com.bmsh.router.assistant.service.MacService;
import com.bmsh.router.assistant.util.ObjectMapper2;

@Service
@Transactional
public class MacServiceImpl extends MacDaoSupport implements MacService {
     Logger log = Logger.getLogger(MacServiceImpl.class);

     @Override
     public List queryMachine() {
            // TODO Auto-generated method stub
           String sql = "select * from t_machine_type";
           
            return getJdbcTemplate().query(sql, new ObjectMapper2(Machine.class ));
     }

}

这是访问100msh_partner的数据库(dataSource2)

import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.bmsh.router.assistant.dao.PartnerDaoSupport;
import com.bmsh.router.assistant.entity.Tag;
import com.bmsh.router.assistant.service.PartnerService;
import com.bmsh.router.assistant.util.ObjectMapper2;
@Service
@Transactional
public class PartnerServiceImpl extends PartnerDaoSupport implements
           PartnerService {
     Logger log = Logger.getLogger(PartnerServiceImpl.class);

     @Override
     public List queryTag() {
           String sql = "select * from anl_tag";
            return getJdbcTemplate().query(sql, new ObjectMapper2(Tag.class ));
     }

}


DEMO下载:http://download.csdn.net/detail/q908555281/9345959

你可能感兴趣的:(JAVA,WEB开发技术)