在项目中,有时遇到连接多个数据库的情况,并且根据用户的操作不同,连接不同的数据库,这时,就要动态切换数据库。环境: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 723Java,用普通类 模拟Interceptor 过程 -
java 关闭其他应用程序或重启机器
2014-06-12 08:49 1476public static Process performCo ... -
mybatis in action
2014-02-25 15:01 1454mybatis实战教程(mybatis in action) ... -
java 创建文件夹和文件
2014-01-06 13:22 1030一:判断文件夹是否存在,不存在则创建 String fileP ... -
spring 发送邮件
2013-09-25 16:12 771Spring mail 发送邮件 一:添加mail jar 包 ... -
Spring 定时器 quartz
2013-09-22 15:36 933spring quartz 定时执行任务(SSH) 配置文件: ... -
java 读取硬件信息
2013-09-05 15:33 1120java 读取计算机信息: 机器名、CPU、内存使用率、IP ... -
java 连接sqlite数据库
2013-09-04 17:22 1407一:首先 添加jar包 二: import java.sql. ... -
java 打包jar 成exe 并动态绑定jre
2013-09-04 17:13 1191转: http://www.doc88.com/p-18569 ... -
Java extends 多态
2013-06-21 16:30 964class A { public int i = 1; ... -
Java GUI(图形用户界面) 布局管理器
2013-04-16 17:03 1160java 图形用户界面布局管理器 -
MyEclipse发布Java应用程序
2013-03-29 11:48 8781、首先:我们使用MyEclipse导出Java应用程序的Ja ... -
基于UDP协议的网络编程(使用DatagramSocket发送接收数据)
2013-03-01 14:21 1626一:UDP服务器端 package socketServer; ... -
S2SH:struts2获取前台数据的三种方式
2013-02-02 09:38 2211struts2 获取前台数据的 ... -
MyEclipse 配置Tomcat 服务器
2013-01-31 14:11 1114一:首先安装JDK和Tomcat 二:打开MyEclipse, ... -
Hibernate 动态添加数据库(数据库信息不固定)
2012-11-03 09:56 1442上篇文章利用spring来连接多个数据库并进行切换数据源, ... -
JavaEE Hibernate 分页查询 语句
2012-06-28 11:01 1591//计算总记录数 public int getTotalRo ...
相关推荐
SSH 配置多个数据库是在项目中遇到连接多个数据库的情况,并且根据用户的操作不同,连接不同的数据库,这时,就要动态切换数据库。本文将介绍如何使用 Spring 和 Hibernate 配置多个数据库,实现动态切换数据库。 ...
本篇文章将深入探讨如何使用SSH框架实现动态连接多个数据库,并动态获取数据库连接。 首先,Spring框架提供了DataSource接口,它是数据库连接的抽象,可以配置多个数据源以连接不同的数据库。在Spring的配置文件中...
当需要在一个项目中连接并操作多个数据库时,Spring框架提供了数据源配置和多数据源切换的能力。具体实现步骤如下: 1. **配置数据源**:在Spring的配置文件中,我们需要为每个数据库创建一个数据源bean。例如,...
在这个场景下,动态数据源允许应用程序根据业务需求或条件在多个数据库之间灵活切换,比如在测试和生产环境间切换,或者针对不同的用户群体使用不同的数据源。 Spring框架在SSH组合中承担了依赖注入和管理任务,...
在某些业务场景下,我们可能需要连接到多个数据库,例如,一个用于存储主业务数据,另一个用于日志或者审计记录。在这种情况下,配置SSH以支持多个数据源就显得尤为重要。 首先,我们需要理解SSH框架中的每个组件的...
7. **连接管理**:Navicat支持多个数据库连接,用户可以管理多个数据库连接,轻松切换,同时连接到不同的数据库服务器。 8. **安全性**:Navicat提供了安全的连接方式,如SSH和SSL,确保数据传输过程中的安全。 9....
用户可以保存多个数据库连接配置,方便随时切换不同的数据库服务器。此外,它还提供了自动重连和断线恢复功能,确保在网络不稳定的情况下仍能保持与数据库的连接。 对于数据库查询和数据操作,SQLyog内置的SQL编辑...
用户可以保存多个连接配置,方便快速切换不同的数据库环境。 2. 数据浏览与编辑:通过表格形式展示数据库中的表结构和数据,用户可以直接在界面上进行数据的查看、添加、修改和删除操作,支持批量操作和条件筛选。 ...
数据同步是数据库切换工具中的一个重要部分,它可以帮助用户保持多个数据库实例之间的数据一致性。用户可以设置同步规则,例如双向同步、定时同步或者基于触发器的同步。这在多数据中心或者分布式系统中非常实用,...
2. **会话管理**:保存多个服务器的连接信息,快速切换不同环境。 3. **宏定义**:定义键盘快捷方式,自动化重复性任务。 4. **传输文件**:通过SFTP或FTP协议,安全地在本地和远程服务器之间传输文件,如导入导出...
用户可以管理多个数据库连接配置,方便切换。 2. **数据浏览与编辑**:用户可以通过表格形式查看数据库中的表数据,同时支持直接编辑记录,包括添加、修改和删除操作。此外,它还提供了搜索、排序和过滤功能,以...
它支持多种数据库系统,包括但不限于MySQL、DB2和Oracle,使得用户无需切换不同的工具就能管理和操作各种类型的数据库。下面我们将详细探讨DBeaver的主要特性和使用方法。 1. **多数据库支持** DBeaver的亮点之一...
综上所述,Navicat作为一款开发工具,其核心功能在于提供数据库的连接、管理和开发能力,尤其适合需要在多个数据库系统间切换的用户。便携版的设计使得用户可以在任何有需要的地方快速接入并操作数据库,提高工作...
例如,你可以同时管理MySQL和Oracle数据库,无需在多个工具之间切换。 2. **数据连接**: 在Navicat中,创建新的数据库连接非常简单。只需输入服务器地址、端口、用户名、密码等信息,即可建立安全的连接。此外,...
1. 数据库连接:你可以创建、编辑和管理多个数据库连接,方便在不同数据库间切换。 2. 数据库设计:使用Navicat可以设计和创建数据库表,定义字段、数据类型、索引等结构。 3. SQL编辑器:内置的SQL编写器支持自动...
总结起来,SSH多数据源解决方案利用Spring的动态数据源路由功能,结合c3p0连接池组件,实现了在同一个应用中管理多个数据库的能力。这使得系统能够灵活地处理来自不同数据源的数据,提高了系统的健壮性和可扩展性。...
总之,SSH进销存源码是一个集成了多种技术的系统,涉及了数据库配置、框架集成等多个方面。为了在Oracle环境下运行,你需要对配置文件进行适配,并确保所有依赖项和环境设置都正确无误。同时,深入理解SSH框架和...
此外,`ssh-config`文件允许用户定义多个配置段,方便快速切换不同服务器的连接设置。 对于高级用户,可以通过`ssh-agent`管理密钥,并利用`autossh`确保SSH连接始终保持活跃。`autossh`监控连接状态,并在断线后...
同时,它支持保存多个连接配置,方便用户快速切换不同数据库环境。 3. **数据管理**:用户可以通过SQLyog进行数据导入导出、备份恢复、数据同步和数据克隆。这些功能使得数据迁移和备份变得简单,尤其在处理大量...