spring中设置动态数据源

Spring 可以设置动态数据源,这样可以对程序来透明的支持切 换操作不同的数据库。

http://oiote.blog.sohu.com/74596942.html 这篇文章写得非 常不错。测试通过,并准备在项目中使用这个方法。还有几个问题 希望大家给点意见:

首先说一下我的需求:数据库结构都是一样,但具体有多少个 数据库不确定(视具体用户而定),用户操作那个数据库要根据登 录的时候进行选择,或根据用户的权限而定。这个信息肯定是保存 在用户的登录信息中(例如:session)

问题1、当有不同的用户需要操作不同的数据库时(根据登录时 的选择或指定),什么时候切换数据库?是在service层还是dao层 ?这个信息怎么传给层中的方法?如果每个方法都加一个参数这样 不太好吧?

问题2、这个频繁的更换数据库,会不会有性能影响?因为 sessionFactory是一个切换数据库是不是就是重新初始一次 sessionFactory?

附原文如下:

Spring2.0.1以后的版本已经支持配置多数据源,并且可以在运 行的时候动态加载不同的数据源。通过继承 AbstractRoutingDataSource就可以实现多数据源的动态转换。目 前做的项目就是需要访问12个数据源,每个数据源的表结构都是相 同的,所以要求数据源的变动对于编码人员来说是透明,也就是说 同样SQL语句在不同的环境下操作的数据库是不一样的。具体的配 置如下:

一、首先需要写一个静态的键值对照类:

代码

package cn.com.xinli.ccp.dynamicds;
public class DataSourceMap {
public static final String Admin="Admin";
public static final String Yxh = "Yxh";
}

这个类主要在使用的时候当作获得数据源的标志使用。

二、建立一个获得和设置上下文的类:

代码

package cn.com.xinli.ccp.dynamicds;
public class CustomerContextHolder {
private static final ThreadLocal contextHolder =
new ThreadLocal();
public static void setCustomerType(String customerType) {
contextHolder.set(customerType);
}
public static String getCustomerType() {
return (String) contextHolder.get();
}
public static void clearCustomerType() {
contextHolder.remove();
}
}

这个主要负责设置上下文环境和获得上下文环境。

三、建立动态数据源类,这个类必须继承 AbstractRoutingDataSource:

代码

package cn.com.xinli.ccp.dynamicds;
import org.springframework.jdbc.datasource.lookup.AbstractRouting DataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
protected Object determineCurrentLookupKey() {
// TODO Auto-generated method stub
return CustomerContextHolder.getCustomerType();
}
}

这个类实现了 determineCurrentLookupKey方法,该方法返回 一个Object,一般是返回字符串,也可以是枚举类型。该方法中直 接使用了 CustomerContextHolder.getCustomerType()方法获得上 下文环境并直接返回。

时间: 2025-01-20 20:10:49

spring中设置动态数据源的相关文章

spring中配置MySql数据源,怎样配置数据库信息

问题描述 我安装的Mysql5.1,进入命令模式时需要密码:自己设置的(mysql)有一个默认的数据库test,我想连接这个库,或者其他库怎么连接呢?spring中的配置如下:<bean id ="dataSource" class ="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClass

FLASH中设置动态文本的半透明效果

一般我们会使用_alpha(as2).alpha(as3)来设置对象的透明值,可是对于动态文本(或输入文本)使用alpha设置是无效的.网上一般介绍的方法是使用draw位图的方式来处理这个问题,可是这个方法比较麻烦,后来发现了,原来使用滤镜好像会把文本框变成位图模式...(概念性的东东不明白,也许不是这个原因,反正达到了我们的效果),所以使用过滤镜的文本框,可以正常的设置alpha值,于是有了下面的函数(注意是as2的代码,as3也一样,这个就不多说了). import flash.filter

Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)------转帖

什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文件,但总需要重新启动web服务啊,研究了下Quartz在Spring中的动态定时,发现                                   0/10 ?                中cronExpression是关键,如果可以动态设置cronExpression的值,也就说如果我

@Transactional导致AbstractRoutingDataSource动态数据源无法切换的解决办法

上午花了大半天排查一个多数据源主从切换的问题,记录一下: 背景: 项目的数据库采用了读写分离多数据源,采用AOP进行拦截,利用ThreadLocal及AbstractRoutingDataSource进行数据源切换,数据源代码如下: public class RoutingDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DB

Spring实现动态数据源,支持动态添加、删除和设置权重及读写分离

当项目慢慢变大,访问量也慢慢变大的时候,就难免的要使用多个数据源和设置读写分离了. 在开题之前先说明下,因为项目多是使用Spring,因此以下说到某些操作可能会依赖于Spring. 在我经历过的项目中,见过比较多的读写分离处理方式,主要分为两步: 1.对于开发人员,要求serivce类的方法名必须遵守规范,读操作以query.get等开头,写操作以update.delete开头. 2.配置一个拦截器,依据方法名判断是读操作还是写操作,设置相应的数据源. 以上做法能实现最简单的读写分离,但相应的也

在DELPHI程序中动态设置ODBC数据源

在DELPHI数据库应用程序中,我们访问数据库通常有两种方法.一种是通过BDE数据库搜索引擎,即利用DELPHI自带的数据库驱动程序,这种方法的优点是速度快,但应用范围有限,当数据库版本更新时,有可能不能用于操作新的数据库:另一种方法是通过ODBC,这种方法的优点是可以随操作系统(如WINDOWS)提供,作为标准接口能适应多种数据库,缺点是速度慢.在编程时,我们可以根据需要选择其中的一种方法. 在利用ODBC访问数据库时,通常的方法时是在ODBC管理面板中设置一个ODBC系统数据源 (系统DSN

Spring Boot 动态数据源(Spring 注解数据源)

本文实现案例场景: 某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定具体要操作的数据库. 为了在开发中以最简单的方法使用,本文基于注解和AOP的方法实现,在spring boot框架的项目中,添加本文实现的代码类后,只需要配置好数据源就可以直接通过注解使用,简单方便. 一配置二使用1. 启动类注册动态数据源2. 配置文件中配置多个数据源3. 在需要的方法上使用注解指定数据源 1.在启动类添加 @Import({Dynamic

Spring中如何配置DataSource数据源

在Spring框架中有如下3种获得DataSource对象的方法: 1.从JNDI获得DataSource. 2.从第三方的连接池获得DataSource. 3.使用DriverManagerDataSource获得DataSource. 一.从JNDI获得DataSource SpringJNDI数据源配置信息: <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean&qu

spring hibernate 动态数据源 同步所有库的表结构问题

问题描述 spring hibernate 动态数据源 同步所有库的表结构问题 采取spring + hibernate 组成动态多数据源(每个库的表结构相同). 现程序升级需要对数据库表结构进行更改,将hibernate 的hibernate.hbm2ddl.auto 配置为update,结果只能修改defaultTargetDataSource 所连接的一个库. 求有可以使hibernate.hbm2ddl.auto 自动更新所有的库解决方案. 补充:是一个sessionFactory(or