暂时还未发现线程安全的的问题
由于项目需要从已经运行的多个项目的数据库中取值,所以就出现了需要访问多个数据源的情况。
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;
}
相关推荐
spring配置多数据源jdbc
SpringBoot整合JDBC&Druid;数据源示例,整合看一下监控页面,拿来即用,省时省力,增加了自定义配置,注册自己的配置参数。
spring-boot jdbc的一个demo,资源分应该是免费的,没看到,很抱歉。
有spring jdbctemplate 增删改查 配置spring自带的、c3p0、dbcp、druid 4种连接池 以及读取jdbc.properties数据源 自己写的一个行映射器工具类
NULL 博文链接:https://kingxss.iteye.com/blog/1479451
DataSource:数据源 DriverManager:驱动管理 Driver:JDBC驱动 Connection:数据库连接 Statement:语句,执行SQL PrepareStatement:预编译语句,性能更好 CallableStatement:调用存储过程 ...
NULL 博文链接:https://675990021.iteye.com/blog/2265799
springjdbc演示,spring持久层知识,包括注入数据源,jdbcTemplate操作数据库,jdbcTemplate以对象方式操作数据库
由于网上的多数据源事务的帖子大多是2010年以前的,现在spring都已经到4.X了,有些类已经弃用了。 原先很多都是用jotm实现的,但是由于spring的升级,totm的本地化实例那个类已经找不到了,所以我使用了atomikos。 ...
Spring_c3p0与dbcp数据源_的配置.doc 很不错的哦!拿出来和大家一起学习!
Spring配置JDBC,从而操作数据库,这里操作的数据库是MySQL,通过xml配置文件中配置数据源连接,实现数据库的操作
SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询,案例以postgresql和oracle数据库为数据源,分别使用mybatis-plus分页插件和pagehelper分页插件实现分页查询。
如何在spring框架中解决多数据源的问题.pdf
(4) dbcp数据源:commons-dbcp、commons-pool (5) junit: junit、hamcrest (6) mysql 驱动 2 数据库准备 本章文件夹下有sampledb.sql文件,将其导入mysql中,会创建一个数据库sampledb,包含两张数据表。导入方法如...
Spring JDBC Plus Spring JDBC Plus提供了基于的扩展。 当编写比CrudRepository支持的功能更复杂SQL时,它提供必要的功能。 如果您需要结合使用Spring Data JDBC的Persistence功能和SQL执行功能,则Spring JDBC ...
JOTM (Java Open Transaction Manager)是由ObjectWeb协会开发的功能完整的且资源开放的独立的事务管理器。 它提供了 JAVA 应用程序的事务支持,而且与 JTA( JAVA 事务 API)兼容。您可以在JOTM home page 了解到更...
oracle 博文链接:https://just-do-myself.iteye.com/blog/665341
在Spring3中配置数据源,包括DBCP,C3P0,Proxool,Bonecp主要的数据源,里面包含这些数据源的jar文件和依赖文件及配置文件。。 如Bonecp目前听说是最快的数据源,速度是传统的c3p0的25倍, bonecp.properties文件: ...
使用Liquibase的Spring Boot多个数据源多个数据源您需要向yaml配置文件中添加几个数据源定义。 datasource: primary: url: jdbc:mysql://localhost/primary username: root driver-class-name: ...
IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root <value>root ...