基于Struts2 Spring ibatis Oracle10g架构 多数据源动态切换实例

一、概述

基于Spring动态配置多数据源,在大型的应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效的提高系统的水平伸缩性,而这样的解决方案就会补同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求以及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据。

Spring配置多个数据源的方式和具体使用过程,Spring对于多数据源,以数据库表为参照,大体上可以分为两大类情况:

1、表级上的跨数据库,即对于不同的数据库却有不相同的表(表名和表结构完全相同)。

2、非表级上的跨数据库,即多个数据源不存在相同的表。

Spring2.x的版本中采用Proxy模式,就是在方案中实现一个虚拟的数据源,并且采用它来封装数据源选择逻辑,这样就可以有效的地将数据源选择逻辑从Client中分离出来,Client提供选择所需上下文,由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。具体实现就是,虚拟的DataSource仅需要继承AbstractRoutingDataSource实现determineCurrentLookupKey()在其中封装数选择逻辑。

二、前期准备

1、搭建好ssi的web架构

2、创建好oracle数据库实例,该实例中创建实例为orcl和n8web两个数据库实例,并且创建好表空间和对应的数据库表

3、配置好tomcat容易,能正常发布web工程。

4、每个实例中创建如下脚本的表和添加数据,为了区分web能动态的切换数据源,请在两个实例中添加不同的数据即可。

CREATE TABLE UserInfo
(
id        NUMBER(10) NOT NULL,
username  VARCHAR(32),
password  VARCHAR(32),
emial     VARCHAR(15),
sex       VARCHAR(10),
brithday  NUMBER(32),
province  VARCHAR(32),
city      VARCHAR(32),
state     VARCHAR(32),
realname  VARCHAR(32),
college   VARCHAR(255),
highschool  VARCHAR(255),
gradeschool  VARCHAR(32),
regtime      NUMBER(32),
logintime    NUMBER(32),
PRIMARY KEY (id)
);

insert into UserInfo values(1,‘zhangsan‘,‘123456‘,‘[email protected]‘,‘男‘,null,‘湖南‘,‘长沙‘,‘健康‘,‘张三‘,‘北京大学‘,null,null,null,null);
insert into UserInfo values(2,‘zhangsan02‘,‘123456‘,‘[email protected]‘,‘女‘,null,‘北京‘,‘北京‘,‘健康‘,‘张三‘,‘北京大学‘,null,null,null,null);
insert into UserInfo values(3,‘zhangsan03‘,‘123456‘,‘[email protected]‘,‘男‘,null,‘湖南‘,‘长沙‘,‘健康‘,‘张三‘,‘北京大学‘,null,null,null,null);
insert into UserInfo values(4,‘zhangsan04‘,‘123456‘,‘[email protected]‘,‘女‘,null,‘深圳‘,‘深圳‘,‘健康‘,‘张三‘,‘北京大学‘,null,null,null,null);
insert into UserInfo values(5,‘zhangsan05‘,‘123456‘,‘[email protected]‘,‘男‘,null,‘湖南‘,‘长沙‘,‘健康‘,‘张三‘,‘北京大学‘,null,null,null,null);
insert into UserInfo values(6,‘zhangsan06‘,‘123456‘,‘[email protected]‘,‘女‘,null,‘广东‘,‘广州‘,‘健康‘,‘张三‘,‘北京大学‘,null,null,null,null);
insert into UserInfo values(7,‘zhangsan07‘,‘123456‘,‘[email protected]‘,‘男‘,null,‘湖南‘,‘长沙‘,‘健康‘,‘张三‘,‘北京大学‘,null,null,null,null);
insert into UserInfo values(8,‘zhangsan08‘,‘123456‘,‘[email protected]‘,‘女‘,null,‘湖北‘,‘武汉‘,‘健康‘,‘张三‘,‘北京大学‘,null,null,null,null);

三、实现步骤

1、搭建基于struts2+spring+ibatis+oracle10g的web架构(该过程略)

2、创建数据源的名称常量类

public class DataSourceConst {
	public static final String Admin="1";
	public static final String User="2";
}

3、建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称

public class DataSourceContextHolder {
	private static final ThreadLocal contextHolder = new ThreadLocal(); // 线程本地环境
	// 设置数据源类型
	public static void setDataSourceType(String dataSourceType) {
		contextHolder.set(dataSourceType);
	}
	// 获取数据源类型   
	public static String getDataSourceType() {
		return (String) contextHolder.get();
	}
	// 清除数据源类型
	public static void clearDataSourceType() {
		contextHolder.remove();
	}
}

4、建立动态数据源类,注意这个类必须继承AbstractRoutingDataSource,且实现方法determineCurrentLookupKey,该方法返回一个Object,一般是返回字符串:

public class DynamicDataSource extends AbstractRoutingDataSource {

	@Override
	protected Object determineCurrentLookupKey() {
		return DataSourceContextHolder.getDataSourceType();
	}
	@Override
	public Logger getParentLogger() throws SQLFeatureNotSupportedException {
		// TODO Auto-generated method stub
		return null;
	}
}

5、编写Spring的配置文件配置多个数据源

5.1、读取数据源信息的配置,这里我们是从tomcat容器的conf目录下读取jdbc.properties配置文件,该配置文件信息在后面给出。

<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>
					file:${webapp.root}\..\..\conf/jdbc.properties
				</value>
			</list>
		</property>
	</bean>

5.2、配置数据源的配置

<!-- 数据源1配置 -->
	<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc1.url}" />
		<property name="username" value="${jdbc1.username}" />
		<property name="password" value="${jdbc1.password}" />
	</bean>

	<!-- 数据源1配置 -->
	<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc2.url}" />
		<property name="username" value="${jdbc2.username}" />
		<property name="password" value="${jdbc2.password}" />
	</bean>

	<!-- 编写spring 配置文件的配置多数源映射关系 -->
	<bean class="com.song.datasource.DynamicDataSource" id="dataSource">
		<property name="targetDataSources">
			<map key-type="java.lang.String">
				<entry value-ref="dataSource1" key="1"></entry>
				<entry value-ref="dataSource2" key="2"></entry>
			</map>
		</property>
		<!--默认采用dataSource1-->
		<property name="defaultTargetDataSource" ref="dataSource1">
		</property>
	</bean>

说明:上述为两个数据库实例的配置信息,第三段中编写Spring配置文件的多数据源映射关系是关键,这里映射dataSource1和dataSource2对应的key值为1和2,在我们程序中就可以根据这两个key值来做判断,同时还配置了默认的数据源为dataSource1.

5.3、jdbc.properties配置信息如下,这里分别配置了orcl和n8web两个oracle实例的配置信息,账户和口令均为n8_web,在创建数据库表空间和用户时随便取名称。

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc1.url=jdbc:oracle:thin:@127.0.0.1:1521:n8web
jdbc1.username=n8_web
jdbc1.password=n8_web

jdbc2.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
jdbc2.username=n8_web
jdbc2.password=n8_web

说明:从上述配置文件可以看出,dataSource1数据源对应的是n8web这个实例,dataSource2对应的是orcl实例。两个实例创建的账户信息均为n8_web(随意)

四、运行结果如下:

图-1

上图中,前期准备工作中,在数据源1的数据库实例中插入了11条数据,在数据源2的实例中插入了8条数据,下面点击【数据源选择】查看输出的数据列表是否正确,如下:

图-2

选择【数据源2】时,查询出来的数据如下:

图-3

采用PL/SQL工具来验证下是否正确,两个数据库实例中的数据如下:

图-4

图-5

结论:测试的结果是正确的,能根据条件达到动态切换数据源的目的

源码配置文件等下载:(包含源码、各种配置文件、数据库脚本等)

多数据源动态切换

基于Struts2 Spring ibatis Oracle10g架构 多数据源动态切换实例,码迷,mamicode.com

时间: 2024-10-23 07:31:24

基于Struts2 Spring ibatis Oracle10g架构 多数据源动态切换实例的相关文章

基于spring的aop实现多数据源动态切换

https://lanjingling.github.io/2016/02/15/spring-aop-dynamicdatasource/ 基于spring的aop实现多数据源动态切换 发表于 2016-02-15   |   分类于 spring  | 一.多数据源动态切换原理 项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此:又例如:读写分离数据库配置的系统. 1.多数据源设置: 1)静态数据源切换:一般情况下,我们可以配置多个数据源,然后为每个数据源写一套对应的

Struts2+Spring+Ibatis用户注册、登录、管理入门学习实例源码下载

原文:Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 源代码下载地址:http://www.zuidaima.com/share/1550463735532544.htm Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 项目截图: jar包和sql文件都在源码包中. 运行截图: 用户注册页面: 用户管理页面:

spring 数据源动态切换 与dubbo服务

1:问题描述 项目用了spring数据源动态切换,服务用的是dubbo.在运行一段时间后程序异常,更新操作没有切换到主库上.这个问题在先调用读操作后再调用写操作会出现.经分析原因有3: 第一:当程序运行一段时间后调用duboo服务时,读操作与写操作有可能会在一个线程里,当这种情况出现时 2:数据源配置 <idclass>    <name>       <key-type>          <keyvalue-ref/>          <keyv

Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法(转)

一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基本上没有什么问题,但唯一可能出现问题的就是在hibernate做添加操作生成主键策略的时候.因为我们都知道hibernate的数据库本地方言会针对不同的数据库采用不同的主键生成策略. 所以针对这一问题不得不采用自定义的主键生成策略,自己写一个主键生成器的表来维护主键生成方式或以及使用其他的方式来生成

springboot多数据源动态切换和自定义mybatis件分页插

1.配置多数据源 增加druid依赖 完整pom文件 数据源配置文件 route.datasource.driver-class-name= com.mysql.jdbc.Driver route.datasource.url= jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 route.datasource.username= root route.datasource.password= 1234

koala 多数据源动态切换

koala 特点:多数据源动态切换,数据源分组和负载均衡(轮询) 项目源码以及demo:https://github.com/zeq9069/koala 请大家关注一下哦!!哈哈! 最近,在开发项目的时候后,要用到多个数据源的动态切换,于是就开发了koala 这个小小得框架,koala支持多数据源的切换,数据源的分组和负载均衡(轮询)! 只需要将jar引入到你自己的项目中之后,然后进行简单配置就可以使用了!!使用起来 非常方便,该项目提供了三个核心的注解@ChangeTo,@DataSource

Struts2+Spring+Ibatis集成合并

上一篇博客讲述了Struts2+Spring的集成合并,主要是利用了一个中间jar包,这篇博客在加上Ibatis持久层框架,三个框架进行合并.其中Struts2和Spring部分和前边的一样,主要是讲解Spring和Ibatis之间的合并,这里也涉及到Spring的AOP编程思想,声明式事务的使用. 一,看一下分工吧: Struts2:负责流程控制,主要针对的是从JSP页面到action类这一块的步骤. Spring:负责各个类,对象的创建,包括action,service,dao,数据连接对象

spring+mybatis多数据源动态切换

spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源.oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换. web.xml <context-param> <param-name>webAppRootKey</param-name> <param-value>trac</param-value> </context-param> <!-- Spr

springAOP实现基于注解的数据源动态切换

需求 代码实现读写数据库分离 武器 spring3.0以上版本 实现思路 1.继承org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,自定义数据源路由. 2.实现数据源类型管理工具,诸如DBContextHolder,包含设置和读取当前数据源配置. 3.实现数据源切换的AOP. 4.自定义只读注解,诸如@ReadOnlyKey. 5.配置transactionManager,实现aop. 代码示例 1.自定义的