赞
踩
由于目前项目中需要用到项目中的两个库,研究了一下发现一个比较轻松的写法。
首先配置多个数据源并且交给bean管理 写在 Config中
- @Bean(name = "db1")
- public DataSource druidDataSource() {
- DruidDataSource datasource = null;
- //直连数据库
- if ("0".equals(jndiflag)) {
- datasource = new DruidDataSource();
- datasource.setUrl(dbUrl);
- datasource.setUsername(username);
- datasource.setPassword(password);
- datasource.setDriverClassName(driverClassName);
- datasource.setInitialSize(initialSize);
- datasource.setMinIdle(minIdle);
- datasource.setMaxActive(maxActive);
- datasource.setMaxWait(maxWait);
- datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
- datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
- datasource.setValidationQuery(validationQuery);
- datasource.setTestWhileIdle(testWhileIdle);
- datasource.setTestOnBorrow(testOnBorrow);
- datasource.setTestOnReturn(testOnReturn);
- try {
- datasource.setFilters(filters);
- } catch (SQLException e) {
- log.error("druid configuration initialization filter", e);
- }
- } else {
- try {
- Context ctx = new InitialContext();
- datasource = (DruidDataSource) ctx.lookup("");
- } catch (NamingException e) {
- log.error("通过JNDI名称找到DataSource 异常", e);
- }
- }
- return datasource;
- }
-
- @Bean(name = "db2")
- public DataSource druidDataSourceTwo() {
- DruidDataSource datasource = null;
- //直连数据库
- if ("0".equals(jndiflag)) {
- datasource = new DruidDataSource();
- datasource.setUrl(dbUrlTwo);
- datasource.setUsername(usernameTwo);
- datasource.setPassword(passwordTwo);
- datasource.setDriverClassName(driverClassNameTwo);
- datasource.setInitialSize(initialSize);
- datasource.setMinIdle(minIdle);
- datasource.setMaxActive(maxActive);
- datasource.setMaxWait(maxWait);
- datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
- datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
- datasource.setValidationQuery(validationQuery);
- datasource.setTestWhileIdle(testWhileIdle);
- datasource.setTestOnBorrow(testOnBorrow);
- datasource.setTestOnReturn(testOnReturn);
- try {
- datasource.setFilters(filters);
- } catch (SQLException e) {
- log.error("druid configuration initialization filter", e);
- }
- } else {
- try {
- Context ctx = new InitialContext();
- datasource = (DruidDataSource) ctx.lookup("");
- } catch (NamingException e) {
- log.error("通过JNDI名称找到DataSource 异常", e);
- }
- }
- return datasource;
- }
目前配置了两个数据源后,我们也应该在Config 中指定一个默认数据源
- @Bean(name = "dynamicDataSource")
- @Primary
- public DataSource dynamicDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {
- DynamicDataSource dynamicDataSource = new DynamicDataSource();
- // 默认数据源
- dynamicDataSource.setDefaultTargetDataSource(db1);
- // 配置多数据源
- Map<Object, Object> dsMap = new HashMap<>();
- dsMap.put("db1", db1);
- dsMap.put("db2", db2);
-
- dynamicDataSource.setTargetDataSources(dsMap);
- return dynamicDataSource;
- }
以下是DynamicDataSource 类
- package com.guobaojingrong.salesupport.config;/*
- * 消息描述
- * @Description: $
- * @return: $
- * @Author: 李
- * @Date: $ $
- */
-
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
-
- @Slf4j
- public class DynamicDataSource extends AbstractRoutingDataSource {
- @Override
- protected Object determineCurrentLookupKey() {
- log.info("动态获取数据源——{}",DataSourceUtil.getDB());
- return DataSourceUtil.getDB();
- }
- }
DataSourceUtil类
- package com.guobaojingrong.salesupport.config;/*
- * 消息描述
- * @Description: $
- * @return: $
- * @Author: 李
- * @Date: $ $
- */
-
- public class DataSourceUtil {
-
- private static final ThreadLocal<String> contextHolder = new ThreadLocal();
-
- /**
- * 设置数据源名
- * @param dbType
- */
- public static void setDB(String dbType) {
- contextHolder.set(dbType);
- }
-
- /**
- * 获取数据源名
- * @return
- */
- public static String getDB() {
- return contextHolder.get();
- }
-
- /**
- * 清除数据源名
- */
- public static void clearDB() {
- contextHolder.remove();
- }
- }
在Controller 指定对应的库
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。