暂时还未发现线程安全的的问题
由于项目需要从已经运行的多个项目的数据库中取值,所以就出现了需要访问多个数据源的情况。
Spring配置文件
<!-- 属性文件读入 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:resources/spring/database.properties</value>
</list>
</property>
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dynamicDataSource" />
</bean>
<bean id="dynamicDataSource" class="com.primemis.datasource.DynamicDataSource">
<!-- 通过key-value的形式来关联数据源 -->
<property name="targetDataSources">
<map key-type="com.primemis.datasource.DatabaseType">
<entry key="DEFAULT" value-ref="defaultDataSource"></entry>
<entry key="COUNTER" value-ref="counterDataSource"></entry>
<entry key="XPOS" value-ref="xposDataSource"></entry>
<entry key="CONXPOS" value-ref="conxposDataSource"></entry>
<entry key="ESPOS" value-ref="esposDataSource"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="defaultDataSource">
</property>
</bean>
<!--MySql 数据源配置 Bgn -->
<bean id="defaultDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${mysql.driverclass}"></property>
<property name="jdbcUrl" value="${mysql.jdbcurl}"></property>
<property name="user" value="${mysql.user}"></property>
<property name="password" value="${mysql.password}"></property>
<property name="checkoutTimeout" value="${jdbc.checkoutTimeout}"></property>
<property name="acquireIncrement" value="${jdbc.acquireIncrement}"></property> <!-- 当连接池中的连接用完时,C3P0一次性创建新连接的数目2 -->
<property name="initialPoolSize" value="${jdbc.initialPoolSize}"></property> <!-- 初始化时创建的连接数,必须在minPoolSize和maxPoolSize之间 -->
<property name="minPoolSize" value="${jdbc.minPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
<!-- 最大空闲时间,超过空闲时间的连接将被丢弃 [需要注意:mysql默认的连接时长为8小时(28800)【可在my.ini中添加 wait_timeout=30(单位秒)设置连接超时】,这里设置c3p0的超时必须<28800] -->
<property name="maxIdleTime" value="${jdbc.maxIdleTime}"></property>
<!-- <property name="idleConnectionTestPeriod" value="60"></property> --> <!-- 每60秒检查连接池中的空闲连接 -->
<!-- <property name="maxStatements" value="20"></property> --> <!-- jdbc的标准参数 用以控制数据源内加载的PreparedStatement数量,但由于预缓存的Statement属 于单个Connection而不是整个连接 -->
</bean>
<!--MySql 数据源配置 End -->
<!--客流系统 Sql Server 数据源配置 Bgn -->
<bean id="counterDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${counter.driverclass}"></property>
<property name="jdbcUrl" value="${counter.jdbcurl}"></property>
<property name="user" value="${counter.user}"></property>
<property name="password" value="${counter.password}"></property>
<property name="checkoutTimeout" value="${jdbc.checkoutTimeout}"></property>
<property name="acquireIncrement" value="${jdbc.acquireIncrement}"></property> <!-- 当连接池中的连接用完时,C3P0一次性创建新连接的数目2 -->
<property name="initialPoolSize" value="${jdbc.initialPoolSize}"></property> <!-- 初始化时创建的连接数,必须在minPoolSize和maxPoolSize之间 -->
<property name="minPoolSize" value="${jdbc.minPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
<!-- 最大空闲时间,超过空闲时间的连接将被丢弃 [需要注意:mysql默认的连接时长为8小时(28800)【可在my.ini中添加 wait_timeout=30(单位秒)设置连接超时】,这里设置c3p0的超时必须<28800] -->
<property name="maxIdleTime" value="${jdbc.maxIdleTime}"></property>
<!-- <property name="idleConnectionTestPeriod" value="60"></property> --> <!-- 每60秒检查连接池中的空闲连接 -->
<!-- <property name="maxStatements" value="20"></property> --> <!-- jdbc的标准参数 用以控制数据源内加载的PreparedStatement数量,但由于预缓存的Statement属 于单个Connection而不是整个连接 -->
</bean>
<!--客流系统 Sql Server 数据源配置 End -->
<!-- Sybase JDBC信息配置 Bgn -->
<bean id="aDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${Sybase.driverClassName}">
</property>
<property name="jdbcUrl" value="${a.url}"></property>
<property name="user" value="${a.userName}"></property>
<property name="password" value="${a.password}"></property>
</bean>
<bean id="bDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${Sybase.driverClassName}">
</property>
<property name="jdbcUrl" value="${b.url}"></property>
<property name="user" value="${b.userName}"></property>
<property name="password" value="${b.password}"></property>
</bean>
<bean id="cDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${Sybase.driverClassName}">
</property>
<property name="jdbcUrl" value="${c.url}"></property>
<property name="user" value="${c.userName}"></property>
<property name="password" value="${c.password}"></property>
</bean>
<!-- Sybase JDBC信息配置 End -->
DynamicDataSource类
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// TODO Auto-generated method stub
return DatabaseContextHolder.getDatabaseType();
}
}
DatabaseContextHolder类
import org.springframework.util.Assert;
public class DatabaseContextHolder {
private static final ThreadLocal<DatabaseType> contextHolder = new ThreadLocal<DatabaseType>();
public static void setDatabaseType(DatabaseType DatabaseType) {
Assert.notNull(DatabaseType, "DatabaseType cannot be null");
contextHolder.set(DatabaseType);
}
public static DatabaseType getDatabaseType() {
return (DatabaseType) contextHolder.get();
}
public static void clearDatabaseType() {
contextHolder.remove();
}
}
Dao使用方式
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
public int update(String sql, SqlParameterSource paramSource,
DatabaseType type) {
DatabaseContextHolder.setDatabaseType(type);
int rows = this.jdbc.update(sql, paramSource);
DatabaseContextHolder.clearDatabaseType();
return rows;
}
相关推荐
在本篇博客“小码农的代码(三)----------SpringJDBC多数据源应用”中,博主探讨了如何在Spring框架中实现对多个数据库的数据源切换。SpringJDBC是Spring框架的一部分,它提供了对Java Database Connectivity (JDBC...
在Spring Boot应用中,多数据源配置是一项关键的技术,它允许我们同时管理多个数据库,比如主库和从库,或者不同类型的数据库。本教程将详细阐述如何在Spring Boot项目中实现这一功能,从数据源配置、实体管理到...
Spring JDBC不仅包含了JDBC的基本功能,如数据源配置、事务管理,还引入了模板模式,即JdbcTemplate,进一步降低了数据库操作的复杂性。 JdbcTemplate是Spring JDBC的核心类,它是对JDBC的简单而强大的封装。它提供...
在Spring Boot应用中,使用JDBC处理数据是常见的实践,特别是在需要管理多个数据源的场景下。本示例"spring-boot-jdbc多数据源的demo"将帮助我们理解如何在Spring Boot环境中配置和操作多个数据库。多数据源的实现...
**JDBC数据源连接池配置与使用详解** 在Java Web应用中,数据库连接的管理是至关重要的。为了提高性能和资源利用率,开发人员通常会使用数据源连接池。本篇文章将详细讲解JDBC数据源连接池的配置和使用,以帮助你更...
总结来说,Spring整合多数据源是一个涉及到配置、事务管理和代码逻辑设计的过程。通过正确配置数据源,动态选择数据源,以及妥善处理事务,我们可以构建起一个高效、灵活的多数据源系统。这个实例提供了一个基础的...
同时,Spring JDBC支持事务,可以通过TransactionAwareDataSourceProxy包装数据源,使得在JdbcTemplate的使用过程中自动参与到Spring的事务管理中。 在思维导图"Spring Transaction.twd"中,可能包含了Spring事务...
3. **Spring Cloud Config Server**:为了更好地管理和维护多数据源的配置,我们可以结合Spring Cloud Config Server,将配置集中存储并管理。这样,当需要更新数据库配置时,只需更改Config Server上的配置,服务端...
在`demo04`文件中,你可以找到具体的代码实现,包括Spring JDBC的配置、数据源的设置以及上述操作的示例。通过阅读和理解这些代码,你可以更好地掌握Spring JDBC的工作原理和使用方式。同时,通过实践,你将能够体会...
综上所述,`springjdbc.zip`文件中的示例可能展示了如何在Spring环境中配置和使用JDBC,包括数据源配置、事务管理、以及使用`JdbcTemplate`执行增删改查操作的完整流程。通过学习这些示例,开发者可以更好地理解和...
Spring提供了多种数据源实现,如BasicDataSource、SingleConnectionDataSource等。在实际应用中,我们通常会配置一个连接池数据源,如Apache Commons DBCP或HikariCP,以提高性能和资源利用率。 **4. SQL语句的执行...
2. 配置Spring:创建Spring的配置文件,如`applicationContext.xml`,配置Bean、数据源和事务管理器等。 3. 配置Spring MVC:创建Spring MVC的配置文件,如`servlet-context.xml`,配置DispatcherServlet、视图解析...
本教程将深入探讨如何在Spring中配置和管理多个数据源,并以MySQL为例进行实战演示。 首先,我们需要理解Spring Boot对数据源的默认支持。Spring Boot通过`spring.datasource.*`的配置属性简化了数据库连接的设置,...
当我们需要处理多个数据源时,例如在分布式系统或读写分离的场景下,Spring整合MyBatis的多数据源切换就显得尤为重要。这个"spring整合mybatis多数据源"的示例提供了可运行的代码,帮助开发者理解和实践这一功能。 ...
4. **DataSource**:Spring管理的数据源,可以是连接池,如Apache DBCP或C3P0,提高数据库连接的复用性。 **整合使用** 在SpringMVC项目中,SpringJDBC可以用来处理数据访问。通常,我们会在Controller中注入...
4. **DataSource**: 数据源是数据库连接的管理器,Spring支持多种数据源,如Apache的BasicDataSource,Oracle的UcpDataSource等。数据源负责管理数据库连接池,提高数据库操作效率。 5. **Parameterized Queries...
Spring多数据源允许我们在一个应用中同时管理多个数据库连接,通过切换不同的数据源来满足不同业务的需求。实现这一功能的关键在于Spring的DataSourceTransactionManager和AbstractRoutingDataSource。 1. **...
`PlatformTransactionManager`是Spring中处理事务的核心接口,而`DataSourceTransactionManager`是实现该接口的具体类,用于基于数据源的事务管理。声明式事务管理允许在XML配置或注解中定义事务边界,使得事务管理...
总的来说,配置多数据源JDBC涉及到Spring的Bean管理、数据源路由、事务管理和AOP等多个方面。通过合理的配置和设计,可以实现灵活且高效的多数据库访问。在实际项目中,需要根据具体需求调整这些配置,确保系统的...
在这个场景中,我们将关注Spring的两个重要概念:多数据源和AOP,以及如何利用Spring JdbcTemplate进行数据库操作,并通过JUnit进行测试。 首先,"SpringAop多数据源"指的是在同一个应用程序中同时处理多个不同的...