JeeSite配置多数据源方案

JeeSite配置多数据源方案

  • jeesite简介

JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台。 JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Activit为工作流引擎。

JeeSite主要定位于企业信息化领域,

  最近在使用jeesite进行项目开发,真实项目中取其他项目的数据,使用多个数据源的情况比较多,本次有引用多个数据源的情况,做了多数据源的配置如下:

  • jeesite.properties 添加数据源信息,(url,username,pawwword)

 使用 BoneCP 数据库连接池,网上说比P3OP快25倍左右。

1
2
3
4
5
6
7
8
9
10
11
#mysql database setting
jdbc.type=mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql: //***.***.***.***:3306/fsapp_erp?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=****
 
#另一个数据源 database setting
jdbc2.type=mysql
jdbc2.driver=com.mysql.jdbc.Driver
jdbc2.url=jdbc:mysql: //***.***.***.***:3306/fsapp_tyre?useUnicode=true&characterEncoding=utf-8 <br><br>jdbc2.username=root <br><br>jdbc2.password=****

  配置连接池大小

1
2
3
4
#pool settings  配置初始化大小、最小、最大
jdbc.pool.init= 1
jdbc.pool.minIdle= 3
jdbc.pool.maxActive= 20
  • 修改spring-context.xml配置文件,3处需要修改/添加

第一处数据源配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!-- 数据源配置, 使用 BoneCP 数据库连接池 -->
     <bean id= "dataSource"  class = "com.alibaba.druid.pool.DruidDataSource"  init-method= "init"  destroy-method= "close" >
         <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
         <property name= "driverClassName"  value= "${jdbc.driver}"  />
         
         <!-- 基本属性 url、user、password -->
         <property name= "url"  value= "${jdbc.url}"  />
         <property name= "username"  value= "${jdbc.username}"  />
         <property name= "password"  value= "${jdbc.password}"  />
         
         <!-- 配置初始化大小、最小、最大 -->
         <property name= "initialSize"  value= "${jdbc.pool.init}"  />
         <property name= "minIdle"  value= "${jdbc.pool.minIdle}"  />
         <property name= "maxActive"  value= "${jdbc.pool.maxActive}"  />
         
         <!-- 配置获取连接等待超时的时间 -->
         <property name= "maxWait"  value= "60000"  />
         
         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
         <property name= "timeBetweenEvictionRunsMillis"  value= "60000"  />
         
         <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
         <property name= "minEvictableIdleTimeMillis"  value= "300000"  />
         
         <property name= "validationQuery"  value= "${jdbc.testSql}"  />
         <property name= "testWhileIdle"  value= "true"  />
         <property name= "testOnBorrow"  value= "false"  />
         <property name= "testOnReturn"  value= "false"  />
         
         <!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)
         <property name= "poolPreparedStatements"  value= "true"  />
         <property name= "maxPoolPreparedStatementPerConnectionSize"  value= "20"  /> -->
         
         <!-- 配置监控统计拦截的filters -->
         <property name= "filters"  value= "stat"  />
     </bean>

 第二处数据源配置,新增,和第一个一样配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!-- 第二个数据源配置, 使用 BoneCP 数据库连接池 -->
<bean id= "dataSource2"  class = "com.alibaba.druid.pool.DruidDataSource"  init-method= "init"  destroy-method= "close" >
     <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
     <property name= "driverClassName"  value= "${jdbc2.driver}"  />
      
     <!-- 基本属性 url、user、password -->
     <property name= "url"  value= "${jdbc2.url}"  />
     <property name= "username"  value= "${jdbc2.username}"  />
     <property name= "password"  value= "${jdbc2.password}"  />
      
     <!-- 配置初始化大小、最小、最大 -->
     <property name= "initialSize"  value= "${jdbc2.pool.init}"  />
     <property name= "minIdle"  value= "${jdbc2.pool.minIdle}"  />
     <property name= "maxActive"  value= "${jdbc2.pool.maxActive}"  />
      
     <!-- 配置获取连接等待超时的时间 -->
     <property name= "maxWait"  value= "60000"  />
      
     <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
     <property name= "timeBetweenEvictionRunsMillis"  value= "60000"  />
      
     <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
     <property name= "minEvictableIdleTimeMillis"  value= "300000"  />
      
     <property name= "validationQuery"  value= "${jdbc.testSql}"  />
     <property name= "testWhileIdle"  value= "true"  />
     <property name= "testOnBorrow"  value= "false"  />
     <property name= "testOnReturn"  value= "false"  />
      
     <!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)
     <property name= "poolPreparedStatements"  value= "true"  />
     <property name= "maxPoolPreparedStatementPerConnectionSize"  value= "20"  /> -->
      
     <!-- 配置监控统计拦截的filters -->
     <property name= "filters"  value= "stat"  />
</bean>

  配置动态数据源,同时指定默认数据源

1
2
3
4
5
6
7
8
9
10
<!-- 动态数据源 -->
  <bean id= "dynamicDataSource"  class = "com.thinkgem.jeesite.common.db.DynamicDataSource" >
      <property name= "defaultTargetDataSource"  ref= "dataSource" />
      <property name= "targetDataSources" >
          <map>
              <entry key= "dataSource"  value-ref= "dataSource" />
              <entry key= "dataSource2"  value-ref= "dataSource2" />
          </map>
      </property>
  </bean>

  spring-context.xml:sqlSessionFactory修改为dynamicDataSource

1
2
3
4
5
6
7
8
<!-- MyBatis begin -->
     <bean id= "sqlSessionFactory"  class = "org.mybatis.spring.SqlSessionFactoryBean" >
         <property name= "dataSource"  ref= "dynamicDataSource" />
         <property name= "typeAliasesPackage"  value= "com.its" />
         <property name= "typeAliasesSuperType"  value= "com.its.common.persistence.BaseEntity" />
         <property name= "mapperLocations"  value= "classpath:/mappings/**/*.xml" />
         <property name= "configLocation"  value= "classpath:/mybatis-config.xml" ></property>
     </bean>

  事务切换,修改为dynamicDataSource

1
2
3
4
<!-- 定义事务 -->
<bean id= "transactionManager"  class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
     <property name= "dataSource"  ref= "dynamicDataSource"  />
</bean>
  •   配置完成,修改java文件引用数据源

添加java文件,DynamicDataSource.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package  com.its.common.db;
 
import  org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
 
/**
  * Mysql 多数据源切换
  *
  * @version V1.0
  * @Description:
  * @date 2015/10/09
  */
public  class  DynamicDataSource  extends  AbstractRoutingDataSource
{
     private  static  final  ThreadLocal<String> contextHolder =  new  ThreadLocal<String>(); 
        
     /*
      * (non-Javadoc)
     
      * @see
      * org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource#
      * determineCurrentLookupKey()
      */ 
     @Override 
     protected  Object determineCurrentLookupKey() { 
         return  getCurrentLookupKey(); 
    
     
     /**
     
      * @author sa
      * @date 2012-5-18 下午4:06:44
      * @return the currentLookupKey
      */ 
     public  static  String getCurrentLookupKey() { 
         return  (String) contextHolder.get(); 
    
    
     /**
     
      * @author sa
      * @date 2012-5-18 下午4:06:44
      * @param currentLookupKey
      *            the currentLookupKey to set
      */ 
     public  static  void  setCurrentLookupKey(String currentLookupKey) { 
         contextHolder.set(currentLookupKey); 
    
    
    
}
  •   在Controller中切换controle 中应用
1
2
3
4
5
6
7
Tyre entity =  null ;
if  (StringUtils.isNotBlank(tyreNo)){
     //切换数据源dataSource2,默认数据源dataSource
     DynamicDataSource.setCurrentLookupKey( "dataSource2" );
     entity = tyreService.getByNo(tyreNo);
}
DynamicDataSource.setCurrentLookupKey( "dataSource" );

  完成。

注意切换完数据源,使用非默认的数据源的时候,使用完成要切换回来,否则有可能会发生错误。在其他services层切换的没有使用成功,先这样使用。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值