0 0

请教下Spring中多数据源问题。5

场景如下:
spring中配置多个数据源如A,B,登录的时候,切换成A数据源读取用户,权限等数据,读完后立马切换到B数据源,进行普通操作(也就是说,用户数据都是放在A数据源中)

问题来了:当并发高的时候,会不会出现有人登录数据源切换到A了,然后其他用户在普通操作时,找不到B数据源中的表呢?
通俗的说就是出现抢数据源的问题!!!
请教大神的解答。
配置如下:

<!-- A数据源 -->
	<bean id="bg_dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName">
			<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:mysql://localhost:3306/A?useUnicode=true&amp;characterEncoding=utf-8</value>
		</property>
		<property name="username">
			<value>root</value>
		</property>
		<property name="password">
			<value>root</value>
		</property>
		<!-- 初始化连接 -->
		<property name="initialSize">
			<value>5</value>
		</property>
		<!-- 最大连接数 -->
		<property name="maxActive" value="1000" />
		<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
		<property name="maxWait" value="6000" />
		<!-- 最大空闲连接 -->
		<property name="maxIdle" value="30" />
		<!-- 最小空闲连接 -->
		<property name="minIdle" value="5" />
		<!-- 连接不上时,将再次进行连接 -->
		<property name="testWhileIdle" value="true" />
		<property name="minEvictableIdleTimeMillis" value="20000" />
		<property name="timeBetweenEvictionRunsMillis" value="20000" />
	</bean>
		
	<!-- B数据源 -->
	<bean id="app_dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName">
			<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:mysql://localhost:3306/B?useUnicode=true&amp;characterEncoding=utf-8</value>
		</property>
		<property name="username">
			<value>root</value>
		</property>
		<property name="password">
			<value>root</value>
		</property>
		<!-- 初始化连接 -->
		<property name="initialSize">
			<value>5</value>
		</property>
		<!-- 最大连接数 -->
		<property name="maxActive" value="1000" />
		<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
		<property name="maxWait" value="6000" />
		<!-- 最大空闲连接 -->
		<property name="maxIdle" value="30" />
		<!-- 最小空闲连接 -->
		<property name="minIdle" value="5" />
		<!-- 连接不上时,将再次进行连接 -->
		<property name="testWhileIdle" value="true" />
		<property name="minEvictableIdleTimeMillis" value="20000" />
		<property name="timeBetweenEvictionRunsMillis" value="20000" />
	</bean>
	
	<bean id="dataSource" class="com.dsp.core.util.DynamicDataSource">
		<property name="targetDataSources">
			<map key-type="java.lang.String">
				<entry key="app_dataSource" value-ref="app_dataSource" />
				<entry key="bg_dataSource" value-ref="bg_dataSource" />
			</map>
		</property>
		<property name="defaultTargetDataSource" ref="app_dataSource" />
	</bean>


问题补充:DynamicDataSource中的方法

/**
* 动态数据源类
* @author tanjun
* @date 2013年08月23日
*/
public class DynamicDataSource extends AbstractRoutingDataSource {

@Override
public Object determineCurrentLookupKey() {

return  DbContextHolder.getDbType();
}

}

DbContextHolder中的方法
//线程安全的ThreadLocal
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

//设置数据源类型
public static void setDbType(String dbType) {
contextHolder.set(dbType);
}

//获取数据源类型
public static String getDbType() {
return ((String)contextHolder.get());
}

//清除数据源类型
public static void clearDbType() {
contextHolder.remove();
}
2013年10月25日 09:16

2个答案 按时间排序 按投票排序

0 0

ThreadLocal线程安全应该没问题吧,楼主使用完数据后应该加个try{}finally{}调下clearDbType()

2013年10月25日 10:27
0 0

关键在com.dsp.core.util.DynamicDataSource这个类的实现,你这里没贴出代码,根据配置推断的话应该是线程安全没做好,线程少的时候不容易发现问题,并发一上去就有问题了。。。

2013年10月25日 09:47

相关推荐

    spring boot多数据源配置

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

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    在本文中,我们将深入探讨如何实现动态数据源切换,支持Spring声明式事务管理,并讨论多数据源回滚策略。以下是对这些知识点的详细说明: 1. **动态数据源切换**: - 通过AspectJ实现数据源的动态切换,可以设置在...

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

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

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

    这些代码可以直接集成到你的项目中,只需要调整为匹配你的数据库配置,就可以实现Spring Boot 2下的多数据源支持,同时利用Hibernate和MyBatis的优势。 总之,多数据源的实现是Spring Boot 2应用中的高级特性,它...

    spring 动态多数据源配置代码

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

    spring多数据源

    在许多实际项目中,我们可能需要连接并操作多个数据库,比如主从数据库、读写分离、不同环境的数据隔离等,这时就需要用到Spring的多数据源支持。 Spring多数据源允许我们在一个应用中同时管理多个数据库连接,通过...

    java spring 多数据源

    在Java Spring框架中,多数据源的实现是一个重要的特性,特别是在大型企业级应用中,它允许应用程序连接到多个数据库,从而实现数据隔离、负载均衡或读写分离等高级功能。本教程将深入探讨如何在Spring中配置和管理...

    spring整合mybatis多数据源

    当我们需要处理多个数据源时,例如在分布式系统或读写分离的场景下,Spring整合MyBatis的多数据源切换就显得尤为重要。这个"spring整合mybatis多数据源"的示例提供了可运行的代码,帮助开发者理解和实践这一功能。 ...

    spring整合多数据源完整实例

    在Spring框架中整合多数据源是一项常见的需求,特别是在大型企业应用或者分布式系统中,往往需要连接不同的数据库以满足不同业务场景。本实例将详细介绍如何在Spring中实现这一功能。 首先,我们要理解“多数据源”...

    spring boot多数据源(AOP注解动态切换)

    在Spring Boot应用中,多数据源的配置与管理是一项重要的任务,特别是在大型系统中,可能需要连接到不同的数据库以满足不同业务的需求。本教程将详细讲解如何在Spring Boot项目中集成Druid连接池,并利用AOP注解实现...

    spring+hibernate解决多数据源问题3.pdf

    本文主要介绍在Spring与Hibernate框架下解决多数据源配置的问题。在企业级应用开发中,因为业务需求的不同,往往需要同时操作多个数据库,这就需要配置多数据源来满足这样的需求。 知识点一:数据源与会话工厂 在...

    springAop多数据源

    在这个场景中,我们将关注Spring的两个重要概念:多数据源和AOP,以及如何利用Spring JdbcTemplate进行数据库操作,并通过JUnit进行测试。 首先,"SpringAop多数据源"指的是在同一个应用程序中同时处理多个不同的...

    Spring配置多个数据源

    4. **配置多数据源事务管理器** 为了处理涉及多个数据源的事务,我们需要使用`PlatformTransactionManager`的实现,例如`DataSourceTransactionManager`,并指定对应的数据源: ```java @Bean(name = ...

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

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

    Spring+Hibernate多数据源

    接着,描述中的"Spring+Hibernate多数据源的整合实现demo"意味着这是一个实际操作的示例,它可能包含了一个或多个配置文件和Java代码,展示了如何在Spring Boot或者传统的Spring环境下配置和使用多数据源。在Spring ...

    基于Spring多数据源实例

    本文将深入探讨如何在一个基于Spring框架的应用中实现多数据源的动态切换,以"基于SSI+Oracle架构的多数据源动态切换实例"为例进行详细讲解。 首先,我们需要理解什么是多数据源。多数据源是指在一个应用中同时连接...

    spring3+springmvc+jpa+hibernate多数据源

    "spring3+springmvc+jpa+hibernate多数据源"是一个示例项目,它演示了如何在一个应用中集成Spring 3、Spring MVC、JPA 2.0以及Hibernate,以实现对多个数据源的支持。下面将详细介绍这些技术及其集成的关键点。 **...

    Spring多数据源解决方案

    Spring多数据源解决方案是针对大型应用中数据分片和分布式数据库管理的需求而设计的一种策略。在这样的场景下,为了提高系统的可扩展性和性能,数据通常会被分散到多个数据库实例上。这种架构如图1所示,每个数据库...

    SpringBoot-SpringData-多数据源

    本篇将深入探讨如何在 Spring Boot 应用中配置和使用 Spring Data 实现多数据源。 **一、Spring Boot 简介** Spring Boot 是 Spring 框架的一个扩展,旨在简化创建独立的、生产级别的基于 Spring 的应用。它预设了...

    spring动态选择数据源

    本篇文章将探讨“Spring动态选择数据源”这一主题,它允许我们的应用程序根据业务需求在多个数据源之间灵活切换,这在多租户、读写分离等场景下尤其重要。 首先,理解“数据源”在Spring中的概念。数据源...

Global site tag (gtag.js) - Google Analytics