`

SSH 连接多个数据库并且动态切换

    博客分类:
  • Java
阅读更多
   在项目中,有时遇到连接多个数据库的情况,并且根据用户的操作不同,连接不同的数据库,这时,就要动态切换数据库。环境: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);
分享到:
评论
1 楼 grandhappy 2013-09-21  
非常好能用!!!!

相关推荐

    【最新版】Beekeeper-Studio-1.3.0.dmg【亲测可用】最好的SQL编辑器和数据库管理器

    打开数十个选项卡,以便您无需切换窗口即可串联编写多个查询和表。 轻松保存和组织常用查询,以便您可以在所有连接中一次又一次地使用它们。 表格也有自己的标签!使用我们的表格视图可以按列对结果进行排序和过滤。

    spring框架多数据源切换问题的解决

    针对用户需求选择访问不同的数据库,用的是spring框架,访问不同数据库但表结构相同,不同数据库表结构不一样,不用数据库有些表结构一样有些又不一样! 首先,这个方案完全是在spring的框架下解决的,数据源依然...

    【最新版】Beekeeper-Studio-1.4.0.dmg【亲测可用】最好的SQL编辑器和数据库管理器

    打开数十个选项卡,以便您无需切换窗口即可串联编写多个查询和表。 轻松保存和组织常用查询,以便您可以在所有连接中一次又一次地使用它们。 表格也有自己的标签!使用我们的表格视图可以按列对结果进行排序和过滤。

    基于SSM的java web项目框架

    框架为springMVC,采用spring4.1.2版本,后台java采用1.8(1.7也暂未发现严重缺陷),前端extjs版本使用5.1,tomcat...与我上一个制作的SSH模型不同,struct采用定义多个jsp界面,实现多个可关闭菜单(tab页格式)的展示

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    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...

    ssh(structs,spring,hibernate)框架中的上传下载

    如果有多个映射文件需要声明,使用类路径映射方式显然比直接单独指定映射文件名的方式要简便。  第27~30行定义了Spring代理Hibernate数据操作的HibernateTemplate模板,而第32~34行将该模板注入到tfileDAO中。  ...

    Android应用源码CreativeCommons新闻客户端半成品.zip

    由管理者类进行切换,新闻端实现跟随嵌套listview,使用了git的一个topviewpager框架,下面是拥有头的listview,头再次嵌套viewpager,小点实现了点击切换新闻数据是从自己的服务器上拿的,服务端由ssh搭建。...

    X-Plore File Manager Pro 4.14.01.apk

    主要交互通过触摸屏完成,单击文件夹或文件以打开文件,或长按打开上下文菜单,其中包含可在特定单击项目或多个选定项目上执行的选项。 多选允许一次对更多文件进行操作。单击复选框可以选择文件。通过单击父文件夹...

    CuteFTP9简易汉化版

    在家还是在办公室,行业领先的一种上传软件软件可以智能地和安全地移动你的重要文件在多个地点在广域网或局域网。用一种上传软件你可以发布网页,下载最新的音乐,图片,和软件;或国内服务器之间传输文件,你的互联网服务...

    一款专业安全终端模拟软件 NetSarang Xshell Free 7.0 Build 0049 中文多语免费版.zip

    使用 Xshell,多语言,可在一个屏幕上显示,有没有需要之间切换不同的语言编码。随着越来越多的企业正在向移动提供服务,数据库和应用程序,在UTF-8格式的,有越来越多的终端模拟器,支持UTF-8编码的需求。和,...

    java流程自动化工具

    六、数据处理:如开发环境定期同步数据到测试环境,或多个数据库数据加工过滤等需求。 七、WEB SSH:通过浏览器操作Linux,简单便捷。 整体上讲,基于流程图清晰易直观,且控件使用简单,易掌控,学习门槛低。 二次...

    X-Plore_File_Manager_Donate_v4.18.12.apk

    主要交互操作是通过触摸屏,单击文件夹或文件以打开文件,或长按以打开上下文菜单来完成的,该菜单包含可以在特定单击项或多个选定项上进行的选项。 多选允许一次对更多文件进行操作。可以通过单击复选框来选择文件...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。主要的工作是发展 Web 规范,...

    java web开发技术大全

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》特别介绍了Struts 2对AjAX的支持,还重点剖析了SSH框架的整合开发,并给出了两个综合案例来展示整合SSH框架开发Web应用。 和已经出版的同类图书...

    ZendStudio_13.01

    Windows, Linux, Mac 等多个操作系统版本 多语言支持 专业的编辑器 关键字、语法加亮显示 (PHP, HTML, XHTML, and Javascript) XML& CSS的关键字、语法加亮显示 代码模板 支持 PHP 4 and PHP 5 代码自动完成功能 ...

    跨平台远程管理工具,开箱即用,无需配置,安全稳定

    支持选项卡浮动功能,方便多个窗口协作使用。 支持关键字搜索过滤,极速定位目标项。 支持中英文语言选择。 支持VNC远程桌面访问功能,高级功能需要与WoVNC服务端才支持。 支持标准的RFB 3.3/3.7/3.8协议。 支持...

    java源码包---java 源码 大量 实例

    第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码...

    X-plore File Manager.apk

    主要交互是通过触摸屏完成后,单击文件夹或文件,打开文件,或长按以打开包含它可以在特定的点击过的商品或多个选定的项目进行选择上下文菜单。 多选择允许做的操作上更多的文件一次。文件可以通过单击复选框被选中...

    JAVA上百实例源码以及开源项目

    第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码...

    JAVA上百实例源码以及开源项目源代码

    第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码...

Global site tag (gtag.js) - Google Analytics