`

Spring JDBC 多数据源管理

 
阅读更多

暂时还未发现线程安全的的问题

 

 

由于项目需要从已经运行的多个项目的数据库中取值,所以就出现了需要访问多个数据源的情况。

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多数据源应用

    在本篇博客“小码农的代码(三)----------SpringJDBC多数据源应用”中,博主探讨了如何在Spring框架中实现对多个数据库的数据源切换。SpringJDBC是Spring框架的一部分,它提供了对Java Database Connectivity (JDBC...

    spring boot多数据源配置

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

    spring jdbc.zip

    Spring JDBC不仅包含了JDBC的基本功能,如数据源配置、事务管理,还引入了模板模式,即JdbcTemplate,进一步降低了数据库操作的复杂性。 JdbcTemplate是Spring JDBC的核心类,它是对JDBC的简单而强大的封装。它提供...

    spring-boot-jdbc多数据源的demo

    在Spring Boot应用中,使用JDBC处理数据是常见的实践,特别是在需要管理多个数据源的场景下。本示例"spring-boot-jdbc多数据源的demo"将帮助我们理解如何在Spring Boot环境中配置和操作多个数据库。多数据源的实现...

    JDBC数据源连接池的配置和使用示例

    **JDBC数据源连接池配置与使用详解** 在Java Web应用中,数据库连接的管理是至关重要的。为了提高性能和资源利用率,开发人员通常会使用数据源连接池。本篇文章将详细讲解JDBC数据源连接池的配置和使用,以帮助你更...

    spring整合多数据源完整实例

    总结来说,Spring整合多数据源是一个涉及到配置、事务管理和代码逻辑设计的过程。通过正确配置数据源,动态选择数据源,以及妥善处理事务,我们可以构建起一个高效、灵活的多数据源系统。这个实例提供了一个基础的...

    Spring事务管理和SpringJDBC思维导图

    同时,Spring JDBC支持事务,可以通过TransactionAwareDataSourceProxy包装数据源,使得在JdbcTemplate的使用过程中自动参与到Spring的事务管理中。 在思维导图"Spring Transaction.twd"中,可能包含了Spring事务...

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

    3. **Spring Cloud Config Server**:为了更好地管理和维护多数据源的配置,我们可以结合Spring Cloud Config Server,将配置集中存储并管理。这样,当需要更新数据库配置时,只需更改Config Server上的配置,服务端...

    spring jdbc示例代码

    在`demo04`文件中,你可以找到具体的代码实现,包括Spring JDBC的配置、数据源的设置以及上述操作的示例。通过阅读和理解这些代码,你可以更好地掌握Spring JDBC的工作原理和使用方式。同时,通过实践,你将能够体会...

    springjdbc.zip_SpringJDBC_spring jdbc_spring 增删改查_springjdbc xml

    综上所述,`springjdbc.zip`文件中的示例可能展示了如何在Spring环境中配置和使用JDBC,包括数据源配置、事务管理、以及使用`JdbcTemplate`执行增删改查操作的完整流程。通过学习这些示例,开发者可以更好地理解和...

    Spring JDBC应用实例讲解

    Spring提供了多种数据源实现,如BasicDataSource、SingleConnectionDataSource等。在实际应用中,我们通常会配置一个连接池数据源,如Apache Commons DBCP或HikariCP,以提高性能和资源利用率。 **4. SQL语句的执行...

    spring4 、 springmvc4.2、springjdbc

    2. 配置Spring:创建Spring的配置文件,如`applicationContext.xml`,配置Bean、数据源和事务管理器等。 3. 配置Spring MVC:创建Spring MVC的配置文件,如`servlet-context.xml`,配置DispatcherServlet、视图解析...

    java spring 多数据源

    本教程将深入探讨如何在Spring中配置和管理多个数据源,并以MySQL为例进行实战演示。 首先,我们需要理解Spring Boot对数据源的默认支持。Spring Boot通过`spring.datasource.*`的配置属性简化了数据库连接的设置,...

    spring整合mybatis多数据源

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

    SpringMVC+SpringJDBC

    4. **DataSource**:Spring管理的数据源,可以是连接池,如Apache DBCP或C3P0,提高数据库连接的复用性。 **整合使用** 在SpringMVC项目中,SpringJDBC可以用来处理数据访问。通常,我们会在Controller中注入...

    SpringJDBC

    4. **DataSource**: 数据源是数据库连接的管理器,Spring支持多种数据源,如Apache的BasicDataSource,Oracle的UcpDataSource等。数据源负责管理数据库连接池,提高数据库操作效率。 5. **Parameterized Queries...

    spring多数据源

    Spring多数据源允许我们在一个应用中同时管理多个数据库连接,通过切换不同的数据源来满足不同业务的需求。实现这一功能的关键在于Spring的DataSourceTransactionManager和AbstractRoutingDataSource。 1. **...

    Spring Jdbc的jar包

    `PlatformTransactionManager`是Spring中处理事务的核心接口,而`DataSourceTransactionManager`是实现该接口的具体类,用于基于数据源的事务管理。声明式事务管理允许在XML配置或注解中定义事务边界,使得事务管理...

    spring配置多数据源jdbc

    总的来说,配置多数据源JDBC涉及到Spring的Bean管理、数据源路由、事务管理和AOP等多个方面。通过合理的配置和设计,可以实现灵活且高效的多数据库访问。在实际项目中,需要根据具体需求调整这些配置,确保系统的...

    springAop多数据源

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

Global site tag (gtag.js) - Google Analytics