`
moonlight2010
  • 浏览: 19966 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

spring中配置多数据源

    博客分类:
  • java
阅读更多

最近项目中要增加数据源
所以自己在网上搜了下如何配置
首先看到这个文章,
地址:
http://www.oschina.net/question/54100_30592
感觉挺靠谱,就尝试在项目中配置了一下,
发现如下问题
1,按照文章所述是在dao层进行更改数据源,但是自己尝试了一下
发现不起作用。
原因是:spring的事物管理是在service层,也就是说在service层已经能够得到事物,
如果能够得到事物,那么数据源肯定已经确定了。所以也不能在service层进行更改数据源,也会不起作用
2,在action中进行更改数据源即执行

DataSourceContextHolder.setDataSourceType("2");


虽然会起作用,但是如果再访问其他的action的时候,有可能(为什么说有可能呢,
是因为你访问一次2次或者多次都没有发生异常,或者你访问一次就异常了。自己亲自测试的)会发现
后台报异常,分析异常才发现是因为这个action中走的数据源和自己期望的不对。
原因:
文章中写到通过更改threadLocal中的值,使其当前线程中的数据源发生变化,
threadLocal中存的是key-value类型map对象,
key应该是线程ID(这个我自己理解,如有不对请大家指出,谢谢。)
value就是数据源的标识值。1或者2.
有可能出现以下情况,
线程消失了,但是threadLocal中还有对应这个消失的线程id的value。
此时,一个新的线程产生,并且这个线程的id和消失的线程id相同,那么
在这个线程执行的时候,对应的数据源就是之前消失的线程设的值,
就是产生后台异常的原因。
threadLocal应该是jvm虚拟机进行垃圾回收进行清理,
但是线程消失和垃圾回收不同步,就会导致以上问题,
只需要把

public class DataSourceContextHolder {
	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); // 线程本地环境   
	// 设置数据源类型   
	public static void setDataSourceType(String dataSourceType) {
		contextHolder.set(dataSourceType);
	}
	// 获取数据源类型     
	public static String getDataSourceType() {
		String ret =(String) contextHolder.get();
	  //自己新加 start
		contextHolder.set(DataSourceConst.BVS);
		//自己新加 end
		return ret;
	}
	// 清除数据源类型   
	public static void clearDataSourceType() {
		contextHolder.remove();
	}
	


这个类按照标注的新加一行代码即可,
取完线程的值,以后即刻把线程中的值设置成默认值。
这样就要求如果在一个action中如果执行2个service都不走默认数据源
就需要在每个service代码前设置

DataSourceContextHolder.setDataSourceType("2");


这样才能保证每次执行的SQL是22对应的数据源。
所以,如果要在spring配置多数据源,
只需要按照文章中
地址:
http://www.oschina.net/question/54100_30592配置,
并稍加修改就可以了。



 

分享到:
评论

相关推荐

    spring mvc 配置多数据源

    ### Spring MVC 中配置多数据源详解 在Spring框架中配置多数据源的需求比较常见,尤其在需要处理不同类型的数据库或需要实现数据隔离的应用场景中。本文将详细介绍如何在Spring MVC项目中配置并使用多数据源。 ###...

    spring boot多数据源配置

    2. 配置数据源 在`application.yml`或`application.properties`文件中,为每个数据源定义配置: ```yaml spring: datasource: primary: # 主数据源 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:...

    spring数据源配置

    数据源(DataSource)在Spring中的配置对于实现持久层操作至关重要。 #### 二、Spring中的数据源配置方式 Spring框架支持多种数据源的配置方式,包括但不限于基于XML的配置、基于注解的配置以及基于Java配置的方式...

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

    在Spring Boot中,我们可以通过创建不同的`DataSource` bean来配置多个数据源。每个数据源通常会有一个对应的`JdbcTemplate`或`JpaEntityManagerFactory`。首先,我们需要在`application.yml`或`application....

    Spring配置多个数据源

    在开发企业级应用程序时,有时我们需要连接到不止一个数据库,比如主从数据库分离、读写分离、多租户系统等场景...记住,正确管理和配置数据源对于系统的稳定性和性能至关重要,因此在实际操作时一定要仔细检查和测试。

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

    本文将深入探讨如何在SpringBoot项目中配置多数据源,并实现数据源的动态切换,帮助你理解和掌握这一核心技能。 首先,我们理解"多数据源"的概念。在SpringBoot应用中,多数据源意味着系统能够连接并操作多个不同的...

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

    在Spring Boot应用中,使用`spring-data-jpa`来配置MySQL多数据源是一项常见的需求,尤其是在构建大型分布式系统时,为了实现数据隔离、负载均衡或读写分离等目的。本教程将详细介绍如何在Spring Boot项目中配置多个...

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

    本主题聚焦于在Spring Cloud环境中实现多数据库和多数据源的整合,并且能够动态切换查询的数据库。这是一个复杂但至关重要的需求,特别是在大型企业级应用中,可能需要根据业务逻辑或用户权限连接到不同的数据库。 ...

    spring boot 2多数据源,里面有hibernate和mybatis的多数据源代码

    3. **配置数据源路由**:为了在代码中动态选择使用哪个数据源,可以使用`AbstractRoutingDataSource`,它可以根据预设的规则或运行时条件决定使用哪个数据源。 4. **配置Hibernate和MyBatis**:为每个数据源配置...

    spring 动态多数据源配置代码

    - 在Spring配置中,声明`DataSourceTransactionManager`,并指定使用的`DataSource`。 - 实现策略类,用于决定当前应该使用哪个数据源。这通常涉及在运行时获取上下文信息。 5. **动态切换数据源**: 通过自定义...

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

    1. **数据源配置**:在Spring配置文件中,我们需要定义多个数据源bean,每个数据源对应一个数据库连接。这可能包括Druid或HikariCP这样的连接池配置。 2. **动态数据源**:Spring的AbstractRoutingDataSource类允许...

    spring配置JNDI数据源

    1. **环境配置**:在应用服务器中配置数据源。例如,在Tomcat中,我们可以在`conf/server.xml`文件的`GlobalNamingResources`元素下配置一个`Resource`元素,如下: ```xml ... type="javax.sql.DataSource" ...

    通过Spring Boot配置动态数据源访问多个数据库的实现代码

    Spring Boot配置动态数据源访问多个数据库实现代码详解 通过Spring Boot配置动态数据源访问多个数据库可以实现数据库的动态增删和数量无限的支持,下面将详细介绍该实现代码的知识点。 数据源配置管理 在Spring ...

    springboot多数据源配置

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

    springboot连接池、动态配置多数据源连接池,特别适合大数据部门、数据中台服务的多数据源连接池.zip

    1. **配置数据源**:在`application.properties`或`application.yml`文件中,为每个数据源定义相应的属性,如URL、用户名、密码和驱动类名。 2. **创建数据源bean**:利用@ConfigurationProperties绑定配置文件中的...

    Spring3 整合MyBatis3 配置多数据源动态选择SqlSessionFactory详细教程

    Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 详细教程 本教程主要介绍了 Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 的详细教程。下面将详细介绍如何实现 Spring 整合 ...

    spring整合mybatis多数据源

    1. **配置数据源**:首先,我们需要为每个数据源创建一个单独的DataSource bean。这些数据源可以是JDBC的SimpleDriverDataSource,也可以是其他支持的类型,如Druid或HikariCP。 2. **定义路由规则**:然后,我们...

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

    本文详细介绍了如何在Spring Boot中配置多数据源,包括创建基础工程、配置数据源、配置MyBatis Plus以及Mapper的扫描。这种方式不仅可以提高系统的灵活性和可扩展性,还能有效地解决跨系统的数据交互问题。希望这些...

    spring获取weblogic jndi数据源的两种方式

    在Spring配置文件中,可以通过`org.springframework.jndi.JndiObjectFactoryBean`类来定义一个数据源。例如: ```xml &lt;bean id="sysDB" class="org.springframework.jndi.JndiObjectFactoryBean"&gt; &lt;value&gt;hzsh_...

    spring boot配置多数据源

    在Spring Boot中,我们可以使用`@Bean`注解来创建并配置数据源。 对于MySQL和Oracle这两种不同的数据库,我们需要分别创建两个数据源。以下是一个基本的配置示例: 1. **配置MySQL数据源** 首先,在`application....

Global site tag (gtag.js) - Google Analytics