SpringMVC动态配置双数据源

xiaoxiao2021-02-28  56

由于项目开通了多个进件渠道,数据白天会存在多个数据库中,日终才会整合。 现在需要搞多个数据源去动态查询各个数据库的数据,本文配置了两个数据源,话不多说,接看代码。

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的加载数据源.

转载请注明原文地址: https://www.6miu.com/read-55774.html

最新回复(0)