Spring多数据源管理

Spring多数据源管理

环境

1. Tomcat 6.0.28

2. Spring 2.5, SpringSide 2.5

3. Hibernate

业务需求

1. Spring 管理多个数据源,针对通应用有效促进数据库分库,分用户

2. 分布式事务控制

3. 通过JNDI来获取数据源,程序员无需关系数据库相关配置

4. 抽取低层框架,用户权限集中管理

步骤

Tomcat配置

1. Tomcat有两种配置数据源的方式,

 第一种:全局数据库连接池,

 1. CATALINA_HOME/conf/context.xml, 这种称为全局资源,可以配置多个,推荐使用。

auth="Container"
type="javax.sql.XADataSource"
factory="org.objectweb.jotm.datasource.DataSourceFactory"
password="admin"
username="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/ghlf"
maxActive="100"
maxIdle="30"  
maxWait="5000"
/>


 2. CATALINA_HOME/conf/server.xml, 这种可以看成是通过管理界面来配置的数据库连接池。
 username="bmgis" password="bmgis"
 driverClassName="oracle.jdbc.driver.OracleDriver"
 url="jdbc:oracle:thin:@localhost:1521:mydb"
 maxIdle="2" maxWait="5000" maxActive="4"/>


 第二种:局部数据库连接池,CATALINA_HOME/webapps/META-INF/context.xml,


应用数据源引用

   
   
      jdbc/framework 
      javax.sql.DataSource 
      Container 
  

    
   
      jdbc/ghlf 
      javax.sql.DataSource 
      Container 
  


JNDI引用

在spring application.xml中

 
      
 

 
   
  
      
 


配置sessionfactory

在应用中用到hibernate这个ORM框架,所以必须要将spring与hibernate集成

  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  
  
   
  

  
   
    
     ${hibernate.dialect}
    

    
     ${hibernate.show_sql}
    

    
     ${hibernate.format_sql}
    

    
     org.hibernate.cache.EhCacheProvider
    

    
     ${hibernate.ehcache_config_file}
    

   

  

  
 


            class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  
  
   
  

  
   
    
     ${hibernate.dialect}
    

    
     ${hibernate.show_sql}
    

    
     ${hibernate.format_sql}
    

    
     org.hibernate.cache.EhCacheProvider
    

    
     ${hibernate.ehcache_config_file}
    

   

  

  
 


事务管理

由于应用中用到的是annotation,事务控制全部在业务层去显示申明,并且在多数据源的环境中,jdbc本地事务是没有办法控制的,必须引用JTA全局事务,这样才能保证多个数据源的数据一致性。由此带来了新的问题,tomcat6是不支持JTA,不比jboss,和websphere等容器,所以必须借助额外的插件或者框架,这里以Jotm (java open transaction manager)为例。

  
 
   
 
     
 

   
   
 


OpensessionInView

必须为多个数据源开启OpenSessionInView模式,这样在lazycelue环境中合理的管理会话,当然这种模式提供了多个配置支持


  hibernateOpenSessionInViewFilterFramework
  org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
  
            excludeSuffixs
            js,css,jpg,gif
       

             
               sessionFactoryBeanName
            sessionFactory_framework  
       
  
 

 
 
 
  hibernateOpenSessionInViewFilterGHLF
  org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
  
  
            excludeSuffixs
            js,css,jpg,gif
       

             
               sessionFactoryBeanName
            sessionFactory_ghlf  
       
  
 



DAO实现指定数据源

由于springside集成了各种数据库操作方式,使用很方便,这里以他为例,

@Repository
public class FriendDAO extends HibernateDao{

 
 @Override
 @javax.annotation.Resource(name="sessionFactory_ghlf")
 public void setSessionFactory(SessionFactory sessionFactory) {
  super.setSessionFactory(sessionFactory);
 }
 
}


分析

经过上面的配置基本可以运行,但是经过测试发现还有如下问题待解决:

1. JTA事务在异常的时候未能回滚

2. lazy加载存在问题

解决方案

1. 经过问题的错误及排查,可以肯定的是在数据元的配置上面,可能需要我们关注这两者的差别DataSource 和XADataSource, 前者在JTA环境下确实没有办法管理JTA事务,后者在JTA上面才支持事务,由此我们必须要启用XADataSource。

auth="Container"
type="javax.sql.XADataSource"
factory="org.objectweb.jotm.datasource.DataSourceFactory"
password="admin"
username="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/ghlf"
maxActive="100"
maxIdle="30"  
maxWait="5000"
/>


2. lazy加载问题出现主要是因为我们使用了spring-security来做权限管理,由此带来配置问题规范问题,我们前端主要用到的框架如下: structs,spring-security ,openSessionInView,siteMap,因此这几个的初始配置顺序是要考虑的。


  encodingFilter
  /*
 

 
 
  hibernateOpenSessionInViewFilterFramework
  /*
 

 
 
  hibernateOpenSessionInViewFilterGHLF
  /*
 

   
  springSecurityFilterChain
  /*
 

 
 
        sitemesh
        *.action
        *.jsp
   

   
 
 
  struts2Filter
  *.action
  REQUEST
  FORWARD
 


你可能感兴趣的:(java,DataBase,freamwork,manager)