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层切换的没有使用成功,先这样使用。