在项目中,有时遇到连接多个数据库的情况,并且根据用户的操作不同,连接不同的数据库,这时,就要动态切换数据库。环境:SSH(利用到了Hibernate 注解)。
Spring2.x的版本中采用Proxy模式,就是我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样*就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文(因为这是Client所知道的),**由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。
具体的实现就是,虚拟的DataSource仅需继承AbstractRoutingDataSource实现
determineCurrentLookupKey()在其中封装数据源的选择逻辑。 步骤如下:
一:动态配置多数据源(用类表示)
public class DataSourceConst {
public static final String Admin="admin";//admin和配置文件中的<entry value-ref="adminDataSource" key="admin"></entry> 对应
public static final String User="user";//user和配置文件中的 <entry value-ref="userDataSource" key="user"></entry> 对应
}
二:建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称
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();
}
}
三:建立动态数据源类,返回一个Object,一般是返回字符串
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
四:编写spring的配置文件配置多个数据源 applicationContext.xml 部分代码
<!-- 读取并设置数据库相关属性 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list> <!--连接数据库的信息(数据库信息已固定)-->
<value>classpath:db.properties</value>
<value>classpath:newdb.properties</value>
</list>
</property>
</bean>
<!-- 配置多个数据源 -->
<!-- 数据源相同部分 -->
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="parentDataSource">
<property name="driverClassName" value="${drivers}" />
</bean>
<!-- 198上的数据库 -->
<bean parent="parentDataSource" id="adminDataSource">
<property name="url" value="${DefaultDBUrl.url}" />
<property name="username" value="${DefaultDBUrl.user}" />
<property name="password" value="${DefaultDBUrl.password}" />
</bean>
<!-- 199 上的数据库 -->
<bean parent="parentDataSource" id="userDataSource">
<property name="url" value="${newDBUrl.url}" />
<property name="username" value="${newDBUser.user}" />
<property name="password" value="${newDBPassword.password}" />
</bean>
<!-- 编写spring配置文件 配置多数据源映射关系 -->
<bean class="DyDataSource.DynamicDataSource" id="dataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="adminDataSource" key="admin"></entry>
<entry value-ref="userDataSource" key="user"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="adminDataSource"></property>
</bean>
<!-- sessionFactory 配置 -->
<bean class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" id="sessionFactory">
<property name="dataSource">
<ref local="dataSource"></ref>
</property>
<!-- 为sessionFactory设置Hibernate属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
<!-- SQLServer:org.hibernate.dialect.SQLServerDialect -->
<!-- MySql -->
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<!-- 如果做了下面的配置,将影响事务配置,servcie中事务不会回滚, -->
<!--<prop key="hibernate.connection.release_mode">
after_transaction
</prop>-->
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.luguang.model</value>
</list>
</property>
</bean>
五:在应用程序中,动态切换数据库
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
DataSourceContextHolder.setDataSourceType(DataSourceConst.Admin);
LgispUser user0=new LgispUser();
user0.setUserAlias("AdminDB 000user");
user0.setOrgId(1);
this.lgispUserService.getEntityDao().save(user0);
DataSourceContextHolder.setDataSourceType(DataSourceConst.User);
this.lgispUserService.getEntityDao().save(user0);
Spring2.x的版本中采用Proxy模式,就是我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样*就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文(因为这是Client所知道的),**由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。
具体的实现就是,虚拟的DataSource仅需继承AbstractRoutingDataSource实现
determineCurrentLookupKey()在其中封装数据源的选择逻辑。 步骤如下:
一:动态配置多数据源(用类表示)
public class DataSourceConst {
public static final String Admin="admin";//admin和配置文件中的<entry value-ref="adminDataSource" key="admin"></entry> 对应
public static final String User="user";//user和配置文件中的 <entry value-ref="userDataSource" key="user"></entry> 对应
}
二:建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称
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();
}
}
三:建立动态数据源类,返回一个Object,一般是返回字符串
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
四:编写spring的配置文件配置多个数据源 applicationContext.xml 部分代码
<!-- 读取并设置数据库相关属性 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list> <!--连接数据库的信息(数据库信息已固定)-->
<value>classpath:db.properties</value>
<value>classpath:newdb.properties</value>
</list>
</property>
</bean>
<!-- 配置多个数据源 -->
<!-- 数据源相同部分 -->
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="parentDataSource">
<property name="driverClassName" value="${drivers}" />
</bean>
<!-- 198上的数据库 -->
<bean parent="parentDataSource" id="adminDataSource">
<property name="url" value="${DefaultDBUrl.url}" />
<property name="username" value="${DefaultDBUrl.user}" />
<property name="password" value="${DefaultDBUrl.password}" />
</bean>
<!-- 199 上的数据库 -->
<bean parent="parentDataSource" id="userDataSource">
<property name="url" value="${newDBUrl.url}" />
<property name="username" value="${newDBUser.user}" />
<property name="password" value="${newDBPassword.password}" />
</bean>
<!-- 编写spring配置文件 配置多数据源映射关系 -->
<bean class="DyDataSource.DynamicDataSource" id="dataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="adminDataSource" key="admin"></entry>
<entry value-ref="userDataSource" key="user"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="adminDataSource"></property>
</bean>
<!-- sessionFactory 配置 -->
<bean class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" id="sessionFactory">
<property name="dataSource">
<ref local="dataSource"></ref>
</property>
<!-- 为sessionFactory设置Hibernate属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
<!-- SQLServer:org.hibernate.dialect.SQLServerDialect -->
<!-- MySql -->
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<!-- 如果做了下面的配置,将影响事务配置,servcie中事务不会回滚, -->
<!--<prop key="hibernate.connection.release_mode">
after_transaction
</prop>-->
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.luguang.model</value>
</list>
</property>
</bean>
五:在应用程序中,动态切换数据库
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
DataSourceContextHolder.setDataSourceType(DataSourceConst.Admin);
LgispUser user0=new LgispUser();
user0.setUserAlias("AdminDB 000user");
user0.setOrgId(1);
this.lgispUserService.getEntityDao().save(user0);
DataSourceContextHolder.setDataSourceType(DataSourceConst.User);
this.lgispUserService.getEntityDao().save(user0);
发表评论
-
Java 模拟Interceptor 过程
2015-09-29 16:25 626Java,用普通类 模拟Interceptor 过程 -
java 关闭其他应用程序或重启机器
2014-06-12 08:49 1428public static Process performCo ... -
mybatis in action
2014-02-25 15:01 1392mybatis实战教程(mybatis in action) ... -
java 创建文件夹和文件
2014-01-06 13:22 971一:判断文件夹是否存在,不存在则创建 String fileP ... -
spring 发送邮件
2013-09-25 16:12 730Spring mail 发送邮件 一:添加mail jar 包 ... -
Spring 定时器 quartz
2013-09-22 15:36 898spring quartz 定时执行任务(SSH) 配置文件: ... -
java 读取硬件信息
2013-09-05 15:33 1025java 读取计算机信息: 机器名、CPU、内存使用率、IP ... -
java 连接sqlite数据库
2013-09-04 17:22 1355一:首先 添加jar包 二: import java.sql. ... -
java 打包jar 成exe 并动态绑定jre
2013-09-04 17:13 1113转: http://www.doc88.com/p-18569 ... -
Java extends 多态
2013-06-21 16:30 894class A { public int i = 1; ... -
Java GUI(图形用户界面) 布局管理器
2013-04-16 17:03 1064java 图形用户界面布局管理器 -
MyEclipse发布Java应用程序
2013-03-29 11:48 8291、首先:我们使用MyEclipse导出Java应用程序的Ja ... -
基于UDP协议的网络编程(使用DatagramSocket发送接收数据)
2013-03-01 14:21 1567一:UDP服务器端 package socketServer; ... -
S2SH:struts2获取前台数据的三种方式
2013-02-02 09:38 2149struts2 获取前台数据的 ... -
MyEclipse 配置Tomcat 服务器
2013-01-31 14:11 1029一:首先安装JDK和Tomcat 二:打开MyEclipse, ... -
Hibernate 动态添加数据库(数据库信息不固定)
2012-11-03 09:56 1386上篇文章利用spring来连接多个数据库并进行切换数据源, ... -
JavaEE Hibernate 分页查询 语句
2012-06-28 11:01 1522//计算总记录数 public int getTotalRo ...
相关推荐
打开数十个选项卡,以便您无需切换窗口即可串联编写多个查询和表。 轻松保存和组织常用查询,以便您可以在所有连接中一次又一次地使用它们。 表格也有自己的标签!使用我们的表格视图可以按列对结果进行排序和过滤。
针对用户需求选择访问不同的数据库,用的是spring框架,访问不同数据库但表结构相同,不同数据库表结构不一样,不用数据库有些表结构一样有些又不一样! 首先,这个方案完全是在spring的框架下解决的,数据源依然...
打开数十个选项卡,以便您无需切换窗口即可串联编写多个查询和表。 轻松保存和组织常用查询,以便您可以在所有连接中一次又一次地使用它们。 表格也有自己的标签!使用我们的表格视图可以按列对结果进行排序和过滤。
框架为springMVC,采用spring4.1.2版本,后台java采用1.8(1.7也暂未发现严重缺陷),前端extjs版本使用5.1,tomcat...与我上一个制作的SSH模型不同,struct采用定义多个jsp界面,实现多个可关闭菜单(tab页格式)的展示
11.6主备数据库切换 11.6.1 Switchover切换 11.6.2 Failover切换 11.7本章小结 第12章 RAC备份 12.1备份与恢复基础 12.1.1备份和恢复解决方案 12.1.2数据库备份的分类 12.1.3错误类型 12.2物理备份工具RMAN...
如果有多个映射文件需要声明,使用类路径映射方式显然比直接单独指定映射文件名的方式要简便。 第27~30行定义了Spring代理Hibernate数据操作的HibernateTemplate模板,而第32~34行将该模板注入到tfileDAO中。 ...
由管理者类进行切换,新闻端实现跟随嵌套listview,使用了git的一个topviewpager框架,下面是拥有头的listview,头再次嵌套viewpager,小点实现了点击切换新闻数据是从自己的服务器上拿的,服务端由ssh搭建。...
主要交互通过触摸屏完成,单击文件夹或文件以打开文件,或长按打开上下文菜单,其中包含可在特定单击项目或多个选定项目上执行的选项。 多选允许一次对更多文件进行操作。单击复选框可以选择文件。通过单击父文件夹...
在家还是在办公室,行业领先的一种上传软件软件可以智能地和安全地移动你的重要文件在多个地点在广域网或局域网。用一种上传软件你可以发布网页,下载最新的音乐,图片,和软件;或国内服务器之间传输文件,你的互联网服务...
使用 Xshell,多语言,可在一个屏幕上显示,有没有需要之间切换不同的语言编码。随着越来越多的企业正在向移动提供服务,数据库和应用程序,在UTF-8格式的,有越来越多的终端模拟器,支持UTF-8编码的需求。和,...
六、数据处理:如开发环境定期同步数据到测试环境,或多个数据库数据加工过滤等需求。 七、WEB SSH:通过浏览器操作Linux,简单便捷。 整体上讲,基于流程图清晰易直观,且控件使用简单,易掌控,学习门槛低。 二次...
主要交互操作是通过触摸屏,单击文件夹或文件以打开文件,或长按以打开上下文菜单来完成的,该菜单包含可以在特定单击项或多个选定项上进行的选项。 多选允许一次对更多文件进行操作。可以通过单击复选框来选择文件...
Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。主要的工作是发展 Web 规范,...
《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》特别介绍了Struts 2对AjAX的支持,还重点剖析了SSH框架的整合开发,并给出了两个综合案例来展示整合SSH框架开发Web应用。 和已经出版的同类图书...
Windows, Linux, Mac 等多个操作系统版本 多语言支持 专业的编辑器 关键字、语法加亮显示 (PHP, HTML, XHTML, and Javascript) XML& CSS的关键字、语法加亮显示 代码模板 支持 PHP 4 and PHP 5 代码自动完成功能 ...
支持选项卡浮动功能,方便多个窗口协作使用。 支持关键字搜索过滤,极速定位目标项。 支持中英文语言选择。 支持VNC远程桌面访问功能,高级功能需要与WoVNC服务端才支持。 支持标准的RFB 3.3/3.7/3.8协议。 支持...
第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码...
主要交互是通过触摸屏完成后,单击文件夹或文件,打开文件,或长按以打开包含它可以在特定的点击过的商品或多个选定的项目进行选择上下文菜单。 多选择允许做的操作上更多的文件一次。文件可以通过单击复选框被选中...
第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码...
第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码...