`
还有也许
  • 浏览: 168519 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

spring中多数据源的配置

 
阅读更多

需求:为减少数据加工所带来的压力,一个应用需要访问两个数据库地址。

首先配置文件的写法:

两个数据源的声明:写法上将数据源相同的部分写到一起,其他bean 标签继承他,便于管理

<bean id="parentDataSource"
		class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass"	value="com.mysql.jdbc.Driver"/>
		
		<!--连接池中保留的最小连接数。-->
		<property name="minPoolSize"><value>5</value></property>
		<!--连接池中保留的最大连接数。Default: 15 -->
		<property name="maxPoolSize"><value>30</value></property>
		<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 5 -->
		<property name="initialPoolSize"><value>5</value></property>
		<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
		<property name="maxIdleTime"><value>0</value></property>
		<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
		<property name="acquireIncrement"><value>5</value></property>
		<!--每1200秒[20分钟]检查所有连接池中的空闲连接。Default: 0 -->
		<property name="idleConnectionTestPeriod"><value>1200</value></property>
		<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
		<property name="acquireRetryAttempts"><value>30</value></property>
	</bean>
	
              <!-- 数据源1-->	
	<bean id="dataSource1"  parent="parentDataSource" >
		
		<property name="jdbcUrl"		value="jdbc:mysql://192.168.1.5:3306/gjcx_adc_mgr?useUnicode=true&amp;characterEncoding=utf-8"/>
		<property name="user" 			value="root"/>
		<property name="password" 		value="root"/>
		
	</bean>
	<!-- 数据源2-->
	<bean id="dataSource2" parent="parentDataSource" >
		
		<property name="jdbcUrl"		value="jdbc:mysql://120.194.181.10:3306/gjcx_adc_mgr?useUnicode=true&amp;characterEncoding=utf-8"/>
		<property name="user" 			value="root"/>
		<property name="password" 		value="root"/>
		
	</bean>

 指定默认数据源

  

<!-- 默认配置datasource1 -->
<bean id="dataSource" class="com.running.crm.datasource.MultiDataSource">
	   <property name="dataSource">
	      <ref bean="dataSource1"/>
	   </property>
</bean>

 

接着sessionFactory配置不变,指定的还是dataSource,代码如下:

  

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
......此处内容省略
</bean>

 

至于手写的MultiDataSource,代码如下:

 

package com.running.crm.datasource;

/**
 * 
 */


import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * @author FanGang
 *
 */
public class MultiDataSource implements DataSource,ApplicationContextAware {

	private static final Log log = LogFactory.getLog(MultiDataSource.class);
	private ApplicationContext applicationContext = null;
	private DataSource dataSource = null;
	
	public Connection getConnection() throws SQLException {
		return getDataSource().getConnection();
	}

	
	public Connection getConnection(String arg0, String arg1)
			throws SQLException {
		return getDataSource().getConnection(arg0, arg1);
	}

	
	public PrintWriter getLogWriter() throws SQLException {
		return getDataSource().getLogWriter();
	}

	
	public int getLoginTimeout() throws SQLException {
		return getDataSource().getLoginTimeout();
	}

	
	public void setLogWriter(PrintWriter arg0) throws SQLException {
		getDataSource().setLogWriter(arg0);
	}

	
	public void setLoginTimeout(int arg0) throws SQLException {
		getDataSource().setLoginTimeout(arg0);
	}

	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext = applicationContext;
	}
	
	public DataSource getDataSource(String dataSourceName){
		log.debug("dataSourceName:"+dataSourceName);
		try{
			if(dataSourceName==null||dataSourceName.equals("")){
				return this.dataSource;
			}
			return (DataSource)this.applicationContext.getBean(dataSourceName);
		}catch(NoSuchBeanDefinitionException ex){
			throw new DaoException("There is not the dataSource <name:"+dataSourceName+"> in the applicationContext!");
		}
	}
	
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	public DataSource getDataSource(){
		String sp = SpObserver.getSp();
		return getDataSource(sp);
	}
}

 

 

里面有个自动捕捉异常类:DaoException.java

 

public class DaoException extends RuntimeException {
    private static final long serialVersionUID = 7662715726329519089L;

    public DaoException(String msg){
        super(msg);
    }
}

 还有个对多线程实现非常好的方法:

public class SpObserver {
	private static ThreadLocal local = new ThreadLocal();

	public static void putSp(String sp) {
		local.set(sp);
	}

	public static String getSp() {
		return (String)local.get();
	}
}

 

接着就可以在需要指定dataSource时,指定dataSource了。

比如在需要指定数据源2的方法里添加一条:

 

SpObserver.putSp("dataSource2");

 

但是我们这样一指定的话,每个方法执行时都是数据源2了,除非每个方法执行之前都加上上面那就话,这不是我们想要的结果,怎么办呢?可以添加一个过滤器,每次执行一个request时都将dataSource置为空,这样如果执行的方法没有指定数据源就用的是数据源1,指定了数据源就是数据源2.

过滤器filter写法:

package com.running.crm.datasource;



import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class filter implements Filter {

	public filter() {
	}

	public void init(FilterConfig filterConfig) throws ServletException {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		//String dataSource = httpRequest.getParameter("dataSource");
		SpObserver.putSp("");
		chain.doFilter(request, response);
	}

	public void destroy() {

	}

}

 

 

过滤器配置:

               <filter>
		<filter-name>dsFilter</filter-name>
		<filter-class>
			com.running.crm.datasource.filter
		</filter-class>
	</filter>
	<filter-mapping>
	  <filter-name>dsFilter</filter-name>
	  <url-pattern>*.do</url-pattern>
	</filter-mapping>

 

这样就可以了。弊端就是每个方法都得手动添加java代码,但是好处也在于此,比如说一个应用新增导入操作频繁,数据量又大,查询缓慢,可以讲导入操作执行一个数据源,查询操作指向另一个数据源,这样就分开了。

还有种配置是直接更改配置文件。两个数据源配置,两个sessionFactory配置,然后将各个dao的指向进行手工的添加,看是用sessionFactory1,还是用2.其实就是通过更改dao的指向来实现多数据源,缺点就是增删改查是一体的,没法分开。

两种都实例亲测,可以通过。

以上文章取自网络,我记不得出处了。只为分享,不为其他。

 

分享到:
评论

相关推荐

    spring boot多数据源配置

    在Spring Boot应用中,多数据源配置是一项关键的技术,它允许我们同时管理多个数据库,比如主库和从库,或者不同类型的数据库。本教程将详细阐述如何在Spring Boot项目中实现这一功能,从数据源配置、实体管理到...

    spring 动态多数据源配置代码

    下面将详细介绍Spring动态多数据源配置的相关知识点。 1. **为什么要使用多数据源**: 在实际项目中,可能需要连接到不同的数据库,例如,一个用于存储主业务数据,另一个用于日志记录或数据分析。通过多数据源...

    spring数据源配置

    ### Spring 数据源配置详解 #### 一、Spring与数据源简介 在Java企业级应用开发中,数据库操作是必不可少的一部分。Spring框架作为一种流行的轻量级Java应用开发框架,提供了强大的数据库访问支持,其中包括对数据...

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    在多数据源配置中,Spring能够帮助管理不同的数据源,通过配置bean来切换和控制数据源的使用。 **SpringMVC** 是Spring框架的一部分,专为Web开发设计。它简化了模型-视图-控制器(Model-View-Controller,MVC)的...

    springboot多数据源配置

    在Spring Boot应用中,多数据源配置是一项重要的技术实践,特别是在大型系统中,可能需要连接到多个数据库以实现数据隔离、读写分离或是分布式事务管理。Spring Boot以其强大的自动化配置能力,使得设置多数据源变得...

    基于注解和Spring的多数据源配置和使用

    在Spring中,多数据源配置通常涉及以下几个关键步骤: 1. **数据源配置**:创建多个DataSource对象,每个对象对应一个数据库连接。可以使用`org.springframework.jdbc.datasource.DriverManagerDataSource`或`...

    Spring Boot+Jpa多数据源配置Demo(支持不同数据库)

    Spring Boot结合JPA(Java Persistence API)和JdbcTemplate,为开发者提供了灵活且强大的多数据源配置能力。本示例将详细介绍如何在Spring Boot项目中实现这样的配置,以支持不同类型的数据库。 首先,我们要理解...

    Spring多数据源配置

    Spring多数据源配置,支持mysql、oracle等多个数据源同时存在的情况

    spring mvc 配置多数据源

    # Oracle数据源配置 jdbc.driver=oracle.jdbc.OracleDriver jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:dev jdbc.username=ling jdbc.password=229 # MySQL数据源配置 jdbc-mysql.driver=com.mysql.jdbc.Driver ...

    SpringBoot配置多数据源实现动态切换数据源

    多数据源配置允许我们灵活地管理这些数据。 SpringBoot实现多数据源主要依靠Spring的`@Configuration`和`@DataSourceConfiguration`注解,以及Spring JDBC的`DataSource`接口。下面是一个基本的配置示例: ```java...

    Spring Boot使用spring-data-jpa配置Mysql多数据源

    # 主数据源配置 spring: datasource: primary: url: jdbc:mysql://localhost:3306/main_db?useSSL=false&serverTimezone=UTC username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver...

    Springcloud 多数库 多数据源整合,查询动态切换数据库

    在Spring Boot和Spring Cloud的背景下,我们可以通过Spring的多数据源配置来实现这一目标。 1. **配置多数据源**:Spring Boot提供了DataSourceAutoConfiguration,它允许我们配置多个数据源。每个数据源可以有自己...

    Spring 数据源不同配置

    下面将详细介绍Spring中常见的数据源配置及其相关知识点。 1. **基本JDBC数据源** Spring提供了一个名为`BasicDataSource`的类,它实现了`javax.sql.DataSource`接口,是最基础的数据源配置。在没有特殊需求的情况...

    SpringBoot多数据源配置(方式一:配置多个mapper扫描不同的包路径实现多数据源配置).docx

    ### Spring Boot多数据源配置详解 #### 一、引言 在实际的软件开发过程中,随着业务需求的多样化,单一的数据源已经无法满足所有场景的需求。例如,有时我们需要同时访问两个或更多的数据库来完成复杂的业务逻辑,...

    SSH框架中的多数据源配置.DOC

    在SSH框架中,多数据源配置可以通过使用Spring框架的数据源配置来实现。Spring框架提供了多种数据源配置方式,包括基于XML的配置和基于Annotation的配置。在这个例子中,我们使用基于XML的配置方式来实现多数据源...

    spring配置JNDI数据源

    Spring框架作为一个强大的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,提供了多种配置数据源的方式,其中包括通过JNDI(Java Naming and Directory Interface)来查找和配置数据源。...

    Spring Boot多数据源(JdbcTemplate)配置与使用

    # 主数据源配置 spring.datasource.primary.url=jdbc:mysql://localhost:3306/main_db spring.datasource.primary.username=root spring.datasource.primary.password=root spring.datasource.primary.driver-class-...

    Spring配置多个数据源

    本文将详细介绍如何在Spring应用中配置多个数据源。 首先,我们来理解数据源(DataSource)的概念。数据源是Java中用于存储数据库连接信息的接口,它实现了JDBC规范中的`javax.sql.DataSource`接口。通过数据源,...

Global site tag (gtag.js) - Google Analytics