SpringMVC动态配置双数据源

由于项目开通了多个进件渠道,数据白天会存在多个数据库中,日终才会整合。

现在需要搞多个数据源去动态查询各个数据库的数据,本文配置了两个数据源,话不多说,接看代码。

applicationContext.xml


<!--     可以读取多个位置的配置文件--> 
    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <!-- <list> -->
                <value>classpath:jdbc.properties</value>
            <!-- </list> -->
        </property>
    </bean>

  <context:component-scan base-package="com.jp.*" />


    <!-- 定义数据源第一个数据源       ,使用C3P0数据源实现 -->
    <!-- 设置连接数据库的驱动、URL、用户名、密码 连接池最大连接数、最小连接数、初始连接数等参数 -->
    <bean id="dataSourceOne" destroy-method="close"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass">
            <value>${jdbc.driver}</value>
        </property>
        <property name="jdbcUrl">
            <value>${jdbc.url}</value>
        </property>
        <property name="user">
            <value>${jdbc.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
        <property name="maxPoolSize">
            <value>${maxPoolSize}</value>
        </property>
        <property name="minPoolSize">
            <value>${minPoolSize}</value>
        </property>
        <property name="initialPoolSize">
            <value>${initialPoolSize}</value>
        </property>
        <property name="maxIdleTime">
            <value>${maxIdleTime}</value>
        </property>
        <property name="idleConnectionTestPeriod">
            <value>${idleConnectionTestPeriod}</value>
        </property>
        <property name="acquireRetryAttempts">
            <value>${acquireRetryAttempts}</value>
        </property>
        <property name="breakAfterAcquireFailure">
            <value>${breakAfterAcquireFailure}</value>
        </property>
        <property name="testConnectionOnCheckout">
            <value>${testConnectionOnCheckout}</value>
        </property>

    </bean>
    <!-- 定义数据源第二个数据源       ,使用C3P0数据源实现 -->
    <!-- 设置连接数据库的驱动、URL、用户名、密码 连接池最大连接数、最小连接数、初始连接数等参数 -->

    <bean id="dataSourceTwo" destroy-method="close"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass">
            <value>${jdbc2.driver}</value>
        </property>
        <property name="jdbcUrl">
            <value>${jdbc2.url}</value>
        </property>
        <property name="user">
            <value>${jdbc2.username}</value>
        </property>
        <property name="password">
            <value>${jdbc2.password}</value>
        </property>
        <property name="maxPoolSize">
            <value>${maxPoolSize}</value>
        </property>
        <property name="minPoolSize">
            <value>${minPoolSize}</value>
        </property>
        <property name="initialPoolSize">
            <value>${initialPoolSize}</value>
        </property>
        <property name="maxIdleTime">
            <value>${maxIdleTime}</value>
        </property>
        <property name="idleConnectionTestPeriod">
            <value>${idleConnectionTestPeriod}</value>
        </property>
        <property name="acquireRetryAttempts">
            <value>${acquireRetryAttempts}</value>
        </property>
        <property name="breakAfterAcquireFailure">
            <value>${breakAfterAcquireFailure}</value>
        </property>
        <property name="testConnectionOnCheckout">
            <value>${testConnectionOnCheckout}</value>
        </property>

    </bean> 

    <!-- 动态数据源 加载转换         默认 MYSQL-->
       <bean id="dynamicDataSource" class="com.jp.controller.switchDatesource.DataSources">  
        <property name="targetDataSources">  
            <map key-type="java.lang.String">  
                <entry value-ref="dataSourceOne" key="MYSQL"></entry>  
                <entry value-ref="dataSourceTwo" key="ORACLE"></entry>  
            </map>  
        </property>  
        <property name="defaultTargetDataSource" ref="dataSourceOne">  
        </property>  
    </bean> 

<!-- 配置 jdbcTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dynamicDataSource"></property>
    </bean>

    <!-- JNDI方式配置数据源 -->
    <!-- 
        <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="${jndiName}"></property> </bean>
     -->

com/jp/controller/switchDatesource/DataSourceInstances.java

public class DataSourceInstances {
     public static final String MYSQL="MYSQL";  
     public static final String ORACLE="ORACLE";  
}

com/jp/controller/switchDatesource/DataSources.java

package com.jp.controller.switchDatesource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
//AbstractRoutingDataSource说是springmvc为多数据源编写的工具类
public class DataSources extends AbstractRoutingDataSource{  
    Object DATESOURCE = null;

    @Override
    protected Object determineCurrentLookupKey() {
        DATESOURCE = DataSourceSwitch.getDataSourceType();
        if (DATESOURCE == null) {
            DATESOURCE = "MYSQL";
        }
        return DATESOURCE;

    }
} 

com/jp/controller/switchDatesource/DataSourceSwitch.java

package com.jp.controller.switchDatesource;

public class DataSourceSwitch {
     private static final ThreadLocal contextHolder=new ThreadLocal();  

        public static void setDataSourceType(String dataSourceType){  
            contextHolder.set(dataSourceType);  
        }  

        public static String getDataSourceType(){  
            return (String) contextHolder.get();  
        }  

        public static void clearDataSourceType(){  
            contextHolder.remove();  
        }  
}

com/jp/controller/TestAction.java

package com.jp.controller;

import *;

@Controller
@RequestMapping("/index")
public class TestAction {

    @Autowired
    private UserServlce userservlce;
    UserQuery uq =new UserQuery ();
    @RequestMapping("/ORACLE.do")
    String ORACLE() {

        DataSourceSwitch.setDataSourceType(DataSourceInstances.ORACLE);//通过DataSourceSwitch配置指定数据源
        UserQuery userlist = userservlce.findAll( uq);

        for (User m : userlist.getUserList()) {
            System.out.println(m.getLoginName());
        }
        return "userlist";
    }


@RequestMapping("/MYSQL.do")
String MYSQL() {
    //通过DataSourceSwitch配置指定数据源                
                DataSourceSwitch.setDataSourceType(DataSourceInstances.MYSQL);
        UserQuery userlist = userservlce.findAll( uq);

        for (User m : userlist.getUserList()) {
            System.out.println(m.getLoginName());
        }
        return "userlist";
    }

}

xml,对数据库进行配置,对关紧的就是

<!-- 动态数据源 加载转换 默认 MYSQL-->
<bean id="dynamicDataSource" class="com.jp.controller.switchDatesource.DataSources">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="dataSourceOne" key="MYSQL"></entry>
<entry value-ref="dataSourceTwo" key="ORACLE"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSourceOne">
</property>
</bean>

总结 :
这里面指定了动态数据源转换的java类,
然后action访问的时候会 通过DataSourceSwitch.setDataSourceType()配置指定数据,
通过DataSources (extends AbstractRoutingDataSource)切换xml的加载数据源.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!感谢您的提问。对于Spring MVC配置MySQL和Oracle数据源,请您在applicationContext.xml文件进行如下配置: 1. 配置MySQL数据源: <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/your_db_name" /> <property name="username" value="your_username" /> <property name="password" value="your_password" /> </bean> 2. 配置Oracle数据源: <bean id="oracleDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:your_db_name" /> <property name="username" value="your_username" /> <property name="password" value="your_password" /> </bean> 3. 配置数据源: <bean id="dataSourceA" parent="dataSource"> <property name="url" value="jdbc:mysql://localhost:3306/db_name_A" /> </bean> <bean id="dataSourceB" parent="dataSource"> <property name="url" value="jdbc:oracle:thin:@localhost:1521/db_name_B" /> </bean> 4. 配置事务管理器: <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSourceA" /> </bean> 5. 配置DAO: <bean id="daoA" class="com.example.DaoA"> <property name="dataSource" ref="dataSourceA" /> </bean> <bean id="daoB" class="com.example.DaoB"> <property name="dataSource" ref="dataSourceB" /> </bean> 6. 配置Service: <bean id="serviceA" class="com.example.ServiceA"> <property name="transactionManager" ref="transactionManager" /> <property name="daoA" ref="daoA" /> </bean> <bean id="serviceB" class="com.example.ServiceB"> <property name="transactionManager" ref="transactionManager" /> <property name="daoB" ref="daoB" /> </bean> 注意:上述配置仅供参考,具体配置根据您的实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值