多数据源的配置
2016-04-28 15:50
609 查看
大型应用为了实现读写分离,便于数据的管理,提高系统的水平伸缩性,往往会用到多数据源。
1,数据源是对应不同数据库的,为了方便操作可以写一个数据库的配置文件
[align=left]UPDATE_MYSQL.type=mysql[/align]
[align=left]UPDATE_MYSQL.autoCommitOnClose=false[/align]
[align=left]UPDATE_MYSQL.driverClassName=com.mysql.jdbc.Driver[/align]
[align=left]UPDATE_MYSQL.url=jdbc:mysql://192.168.1.139:3306/testdatabase?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true[/align]
[align=left]UPDATE_MYSQL.username=xccmysql[/align]
[align=left]UPDATE_MYSQL.password=xccW7W8[/align]
[align=left]UPDATE_MYSQL.initialPoolSize=5[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]SELECT_MYSQL.type=mysql[/align]
[align=left]SELECT_MYSQL.autoCommitOnClose=false[/align]
[align=left]SELECT_MYSQL.driverClassName=com.mysql.jdbc.Driver[/align]
[align=left]SELECT_MYSQL.url=jdbc:mysql://192.168.1.139:3306/testmuti?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true[/align]
[align=left]SELECT_MYSQL.username=root[/align]
[align=left]SELECT_MYSQL.password=xcc2009081231[/align]
[align=left]SELECT_MYSQL.initialPoolSize=5[/align]
2,然后再spring的配置文件里添加不同的数据源
[align=left]<!-- 数据源的配置 -->[/align]
<bean
id
="update_dataSource"
class=
"org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
>
<property
name
="driverClassName"
value=
"${UPDATE_MYSQL.driverClassName}"
/>
<property
name
="url"
value="${UPDATE_MYSQL.url}"
/>
<property
name
="username"
value=
"${UPDATE_MYSQL.username}"
/>
<property
name
="password"
value=
"${UPDATE_MYSQL.password}"
/>
<!-- data source configuration -->
<property
name
="initialSize"
value=
"${UPDATE_MYSQL.initialPoolSize}"
/>
<!-- initial connections -->
<property
name
="maxActive"
value="10"
/><!-- MAX connections -->
<property
name
="maxIdle"
value="10"
/><!-- MAX idle connections -->
<property
name
="minIdle"
value="5"
/><!-- MIN idle connections -->
<!-- 处理mysql
8小时自动断开连接的问题 -->
<property
name
="testWhileIdle"
value=
"true"
/>
<property
name
="testOnBorrow"
value=
"false"
/>
<property
name
="testOnReturn"
value=
"false"
/>
<property
name
="validationQuery"
value=
"select 1"
/>
<property
name
="timeBetweenEvictionRunsMillis"
value=
"20000"
/>
<property
name
="numTestsPerEvictionRun"
value=
"100"
/>
</bean
>
[align=left] [/align]
[align=left] [/align]
<bean
id
="select_dataSource"
class=
"org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
>
<property
name
="driverClassName"
value=
"${UPDATE_MYSQL.driverClassName}"
/>
<property
name
="url"
value="${SELECT_MYSQL.url}"
/>
<property
name
="username"
value=
"${SELECT_MYSQL.username}"
/>
<property
name
="password"
value=
"${SELECT_MYSQL.password}"
/>
<!-- data source configuration -->
<property
name
="initialSize"
value=
"${SELECT_MYSQL.initialPoolSize}"
/>
<!-- initial connections -->
<property
name
="maxActive"
value="10"
/><!-- MAX connections -->
<property
name
="maxIdle"
value="10"
/><!-- MAX idle connections -->
<property
name
="minIdle"
value="5"
/><!-- MIN idle connections -->
<!-- 处理mysql
8小时自动断开连接的问题 -->
<property
name
="testWhileIdle"
value=
"true"
/>
<property
name
="testOnBorrow"
value=
"false"
/>
<property
name
="testOnReturn"
value=
"false"
/>
<property
name
="validationQuery"
value=
"select 1"
/>
<property
name
="timeBetweenEvictionRunsMillis"
value=
"20000"
/>
<property
name
="numTestsPerEvictionRun"
value=
"100"
/>
</bean
>
3,数据源准备好之后,基本工作,已完成,先放在一边,我们去java里面写数据源的名称常量类
package
org.iwall.muti.datasource;
[align=left]/**[/align]
[align=left] *[/align]
*
@author
Lee
[align=left] *[/align]
[align=left] */[/align]
public
class
DataSourceNames {
public
static
final
String
UPDATE_MYSQL="update_dataSource"
;
public
static
final
String
SELECT_MYSQL
=
"select_dataSource";
[align=left]}[/align]
[align=left]
[/align]
[align=left]4,建立一个类,负责改变数据源的名称(其实可使用spring的注解切换不同的数据源)[/align]
[align=left]
[/align]
[align=left]package org.iwall.muti.datasource;[/align]
[align=left]
[/align]
[align=left]import org.apache.commons.logging.Log;[/align]
[align=left]import org.apache.commons.logging.LogFactory;[/align]
[align=left]/**[/align]
[align=left] * 获得和设置上下文环境 主要负责改变上下文数据源的名称[/align]
[align=left] * @author Lee[/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left]public class DataSourceContextHolder {[/align]
[align=left] private static final ThreadLocal contextHandler = new ThreadLocal(); // 线程本地环境[/align]
[align=left] public static Log log = LogFactory.getLog(DataSourceContextHolder.class);[/align]
[align=left] // 设置数据源类型[/align]
[align=left] public static void setDataSourceType(String dataSourceType) {[/align]
[align=left] log.info("set dataSource:" + dataSourceType);[/align]
[align=left] contextHandler.set(dataSourceType);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] // 获取数据源类型 [/align]
[align=left] public static String getDataSourceType() {[/align]
[align=left] return (String) contextHandler.get();[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] // 清除数据源类型[/align]
[align=left] public static void clearDataSourceType() {[/align]
[align=left] contextHandler.remove();[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]5,建立动态数据源,主要实现 determineCurrentLookupKey这个方法[/align]
[align=left]
[/align]
[align=left]package org.iwall.muti.datasource;[/align]
[align=left]
[/align]
[align=left]import java.util.Map;[/align]
[align=left]
[/align]
[align=left]import org.apache.commons.logging.Log;[/align]
[align=left]import org.apache.commons.logging.LogFactory;[/align]
[align=left]import org.springframework.beans.factory.InitializingBean;[/align]
[align=left]import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;[/align]
[align=left]import org.springframework.jdbc.datasource.lookup.DataSourceLookup;[/align]
[align=left]/**[/align]
[align=left] *[/align]
[align=left] * @author Lee[/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left]public class DynamicDataSource extends AbstractRoutingDataSource implements InitializingBean {[/align]
[align=left] private Log log = LogFactory.getLog(DynamicDataSource.class);[/align]
[align=left]
[/align]
[align=left] /* [/align]
[align=left] * 该方法必须要重写 方法是为了根据数据库标示符取得当前的数据库 既是获得数据源类型[/align]
[align=left] */ [/align]
[align=left] @Override [/align]
[align=left] public Object determineCurrentLookupKey() { [/align]
[align=left] log.info("starting determineCurrentLookupKey:" + DataSourceContextHolder.getDataSourceType());[/align]
[align=left] return DataSourceContextHolder.getDataSourceType();[/align]
[align=left] } [/align]
[align=left]
[/align]
[align=left] @Override [/align]
[align=left] public void setDataSourceLookup(DataSourceLookup dataSourceLookup) { [/align]
[align=left] log.info("starting setDataSourceLookup:" + DataSourceContextHolder.getDataSourceType());[/align]
[align=left] super.setDataSourceLookup(dataSourceLookup); [/align]
[align=left] } [/align]
[align=left]
[/align]
[align=left] @Override [/align]
[align=left] public void setDefaultTargetDataSource(Object defaultTargetDataSource) {[/align]
[align=left] log.info("starting setDefaultTargetDataSource:" + DataSourceContextHolder.getDataSourceType());[/align]
[align=left] super.setDefaultTargetDataSource(defaultTargetDataSource); [/align]
[align=left] } [/align]
[align=left]
[/align]
[align=left] @Override [/align]
[align=left] public void setTargetDataSources(Map targetDataSources) {[/align]
[align=left] System.out.println("starting setTargetDataSources:" + DataSourceContextHolder.getDataSourceType());[/align]
[align=left] super.setTargetDataSources(targetDataSources); [/align]
[align=left] //重点 [/align]
[align=left] super.afterPropertiesSet(); [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]6,数据源配置完了,java对应的类也写完了,就需要写映射关系了,其中key是对应java类里的数据源常量名,value是配置文件里的数据源名[/align]
[align=left]
[/align]
<bean
id=
"dynamicDataSource"
class=
"org.iwall.muti.datasource.DynamicDataSource"
>
<!-- 通过key-value的形式来关联数据源 -->
<property
name
="targetDataSources">
<map
key-type
="java.lang.String">
<entry
key
="update_dataSource"
value-ref="update_dataSource"
></entry>
<entry
key
="select_dataSource"
value-ref="select_dataSource"
></entry>
</map>
</property>
<property
name
="defaultTargetDataSource"
ref=
"update_dataSource">
</property>
</bean
>
[align=left]
[/align]
[align=left]7,如果没有使用hibernate,mybatis等数据交互的框架,用spring的模板jdbc的话,注入一下就好[/align]
[align=left]
[/align]
<bean
id=
"jdbcTemplate"
class=
"org.springframework.jdbc.core.JdbcTemplate"
>
<constructor-arg
ref
="dynamicDataSource"
/>
</bean
>
[align=left]
[/align]
[align=left]8,总结下,这种方式,便于维护,基本只用修改数据库配置文件和spring配置文件即可。但是多个用户访问会争抢datasource,系统性能[/align]
[align=left]会降低,(没测试过)。[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
1,数据源是对应不同数据库的,为了方便操作可以写一个数据库的配置文件
[align=left]UPDATE_MYSQL.type=mysql[/align]
[align=left]UPDATE_MYSQL.autoCommitOnClose=false[/align]
[align=left]UPDATE_MYSQL.driverClassName=com.mysql.jdbc.Driver[/align]
[align=left]UPDATE_MYSQL.url=jdbc:mysql://192.168.1.139:3306/testdatabase?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true[/align]
[align=left]UPDATE_MYSQL.username=xccmysql[/align]
[align=left]UPDATE_MYSQL.password=xccW7W8[/align]
[align=left]UPDATE_MYSQL.initialPoolSize=5[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]SELECT_MYSQL.type=mysql[/align]
[align=left]SELECT_MYSQL.autoCommitOnClose=false[/align]
[align=left]SELECT_MYSQL.driverClassName=com.mysql.jdbc.Driver[/align]
[align=left]SELECT_MYSQL.url=jdbc:mysql://192.168.1.139:3306/testmuti?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true[/align]
[align=left]SELECT_MYSQL.username=root[/align]
[align=left]SELECT_MYSQL.password=xcc2009081231[/align]
[align=left]SELECT_MYSQL.initialPoolSize=5[/align]
2,然后再spring的配置文件里添加不同的数据源
[align=left]<!-- 数据源的配置 -->[/align]
<bean
id
="update_dataSource"
class=
"org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
>
<property
name
="driverClassName"
value=
"${UPDATE_MYSQL.driverClassName}"
/>
<property
name
="url"
value="${UPDATE_MYSQL.url}"
/>
<property
name
="username"
value=
"${UPDATE_MYSQL.username}"
/>
<property
name
="password"
value=
"${UPDATE_MYSQL.password}"
/>
<!-- data source configuration -->
<property
name
="initialSize"
value=
"${UPDATE_MYSQL.initialPoolSize}"
/>
<!-- initial connections -->
<property
name
="maxActive"
value="10"
/><!-- MAX connections -->
<property
name
="maxIdle"
value="10"
/><!-- MAX idle connections -->
<property
name
="minIdle"
value="5"
/><!-- MIN idle connections -->
<!-- 处理mysql
8小时自动断开连接的问题 -->
<property
name
="testWhileIdle"
value=
"true"
/>
<property
name
="testOnBorrow"
value=
"false"
/>
<property
name
="testOnReturn"
value=
"false"
/>
<property
name
="validationQuery"
value=
"select 1"
/>
<property
name
="timeBetweenEvictionRunsMillis"
value=
"20000"
/>
<property
name
="numTestsPerEvictionRun"
value=
"100"
/>
</bean
>
[align=left] [/align]
[align=left] [/align]
<bean
id
="select_dataSource"
class=
"org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
>
<property
name
="driverClassName"
value=
"${UPDATE_MYSQL.driverClassName}"
/>
<property
name
="url"
value="${SELECT_MYSQL.url}"
/>
<property
name
="username"
value=
"${SELECT_MYSQL.username}"
/>
<property
name
="password"
value=
"${SELECT_MYSQL.password}"
/>
<!-- data source configuration -->
<property
name
="initialSize"
value=
"${SELECT_MYSQL.initialPoolSize}"
/>
<!-- initial connections -->
<property
name
="maxActive"
value="10"
/><!-- MAX connections -->
<property
name
="maxIdle"
value="10"
/><!-- MAX idle connections -->
<property
name
="minIdle"
value="5"
/><!-- MIN idle connections -->
<!-- 处理mysql
8小时自动断开连接的问题 -->
<property
name
="testWhileIdle"
value=
"true"
/>
<property
name
="testOnBorrow"
value=
"false"
/>
<property
name
="testOnReturn"
value=
"false"
/>
<property
name
="validationQuery"
value=
"select 1"
/>
<property
name
="timeBetweenEvictionRunsMillis"
value=
"20000"
/>
<property
name
="numTestsPerEvictionRun"
value=
"100"
/>
</bean
>
3,数据源准备好之后,基本工作,已完成,先放在一边,我们去java里面写数据源的名称常量类
package
org.iwall.muti.datasource;
[align=left]/**[/align]
[align=left] *[/align]
*
@author
Lee
[align=left] *[/align]
[align=left] */[/align]
public
class
DataSourceNames {
public
static
final
String
UPDATE_MYSQL="update_dataSource"
;
public
static
final
String
SELECT_MYSQL
=
"select_dataSource";
[align=left]}[/align]
[align=left]
[/align]
[align=left]4,建立一个类,负责改变数据源的名称(其实可使用spring的注解切换不同的数据源)[/align]
[align=left]
[/align]
[align=left]package org.iwall.muti.datasource;[/align]
[align=left]
[/align]
[align=left]import org.apache.commons.logging.Log;[/align]
[align=left]import org.apache.commons.logging.LogFactory;[/align]
[align=left]/**[/align]
[align=left] * 获得和设置上下文环境 主要负责改变上下文数据源的名称[/align]
[align=left] * @author Lee[/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left]public class DataSourceContextHolder {[/align]
[align=left] private static final ThreadLocal contextHandler = new ThreadLocal(); // 线程本地环境[/align]
[align=left] public static Log log = LogFactory.getLog(DataSourceContextHolder.class);[/align]
[align=left] // 设置数据源类型[/align]
[align=left] public static void setDataSourceType(String dataSourceType) {[/align]
[align=left] log.info("set dataSource:" + dataSourceType);[/align]
[align=left] contextHandler.set(dataSourceType);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] // 获取数据源类型 [/align]
[align=left] public static String getDataSourceType() {[/align]
[align=left] return (String) contextHandler.get();[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] // 清除数据源类型[/align]
[align=left] public static void clearDataSourceType() {[/align]
[align=left] contextHandler.remove();[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]5,建立动态数据源,主要实现 determineCurrentLookupKey这个方法[/align]
[align=left]
[/align]
[align=left]package org.iwall.muti.datasource;[/align]
[align=left]
[/align]
[align=left]import java.util.Map;[/align]
[align=left]
[/align]
[align=left]import org.apache.commons.logging.Log;[/align]
[align=left]import org.apache.commons.logging.LogFactory;[/align]
[align=left]import org.springframework.beans.factory.InitializingBean;[/align]
[align=left]import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;[/align]
[align=left]import org.springframework.jdbc.datasource.lookup.DataSourceLookup;[/align]
[align=left]/**[/align]
[align=left] *[/align]
[align=left] * @author Lee[/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left]public class DynamicDataSource extends AbstractRoutingDataSource implements InitializingBean {[/align]
[align=left] private Log log = LogFactory.getLog(DynamicDataSource.class);[/align]
[align=left]
[/align]
[align=left] /* [/align]
[align=left] * 该方法必须要重写 方法是为了根据数据库标示符取得当前的数据库 既是获得数据源类型[/align]
[align=left] */ [/align]
[align=left] @Override [/align]
[align=left] public Object determineCurrentLookupKey() { [/align]
[align=left] log.info("starting determineCurrentLookupKey:" + DataSourceContextHolder.getDataSourceType());[/align]
[align=left] return DataSourceContextHolder.getDataSourceType();[/align]
[align=left] } [/align]
[align=left]
[/align]
[align=left] @Override [/align]
[align=left] public void setDataSourceLookup(DataSourceLookup dataSourceLookup) { [/align]
[align=left] log.info("starting setDataSourceLookup:" + DataSourceContextHolder.getDataSourceType());[/align]
[align=left] super.setDataSourceLookup(dataSourceLookup); [/align]
[align=left] } [/align]
[align=left]
[/align]
[align=left] @Override [/align]
[align=left] public void setDefaultTargetDataSource(Object defaultTargetDataSource) {[/align]
[align=left] log.info("starting setDefaultTargetDataSource:" + DataSourceContextHolder.getDataSourceType());[/align]
[align=left] super.setDefaultTargetDataSource(defaultTargetDataSource); [/align]
[align=left] } [/align]
[align=left]
[/align]
[align=left] @Override [/align]
[align=left] public void setTargetDataSources(Map targetDataSources) {[/align]
[align=left] System.out.println("starting setTargetDataSources:" + DataSourceContextHolder.getDataSourceType());[/align]
[align=left] super.setTargetDataSources(targetDataSources); [/align]
[align=left] //重点 [/align]
[align=left] super.afterPropertiesSet(); [/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]6,数据源配置完了,java对应的类也写完了,就需要写映射关系了,其中key是对应java类里的数据源常量名,value是配置文件里的数据源名[/align]
[align=left]
[/align]
<bean
id=
"dynamicDataSource"
class=
"org.iwall.muti.datasource.DynamicDataSource"
>
<!-- 通过key-value的形式来关联数据源 -->
<property
name
="targetDataSources">
<map
key-type
="java.lang.String">
<entry
key
="update_dataSource"
value-ref="update_dataSource"
></entry>
<entry
key
="select_dataSource"
value-ref="select_dataSource"
></entry>
</map>
</property>
<property
name
="defaultTargetDataSource"
ref=
"update_dataSource">
</property>
</bean
>
[align=left]
[/align]
[align=left]7,如果没有使用hibernate,mybatis等数据交互的框架,用spring的模板jdbc的话,注入一下就好[/align]
[align=left]
[/align]
<bean
id=
"jdbcTemplate"
class=
"org.springframework.jdbc.core.JdbcTemplate"
>
<constructor-arg
ref
="dynamicDataSource"
/>
</bean
>
[align=left]
[/align]
[align=left]8,总结下,这种方式,便于维护,基本只用修改数据库配置文件和spring配置文件即可。但是多个用户访问会争抢datasource,系统性能[/align]
[align=left]会降低,(没测试过)。[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树