springboot项目中双数据源的配置

导读:本篇文章讲解 springboot项目中双数据源的配置,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

springboot项目中双数据源的配置

@对于一个项目中我们可能会配置多个数据源的情况,因而在这里向大家具体的介绍下如何在项目中配置多个数据源。比如我们配置一个EHR数据源和一个YSJ数据源。

1.pom文件中引入德鲁伊(druid)的依赖

<dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>druid</artifactId>
		    <version>1.1.12</version>
		</dependency>

2.在我们的项目启动类中我们需要禁用数据源的自动配置的禁用,同时我们需要注入相关的数据源到spring中形成bean对象。

package com.ylkz;
import com.alibaba.druid.pool.DruidDataSource;
import com.ylkz.base.ApplicationParent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
//配置多数据源前禁用自动配置数据源
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
@EnableFeignClients
@EnableTransactionManagement
@Configuration
public class ServiceDemandApplication extends ApplicationParent
{
    protected Logger logger = LoggerFactory.getLogger(ServiceDemandApplication.class);


	public static void main(String[] args) {
        SpringApplication.run( ServiceDemandApplication.class, args );
    }

    @Bean(name="ysjDataSource")
    @ConfigurationProperties(prefix = "druid.datasource.db-ysj")
    public DataSource ysjDataSource() {
        return new DruidDataSource();
    }
    
    @Bean(name="ehrDataSource")
    @ConfigurationProperties(prefix = "druid.datasource.db-ehr")
    public DataSource ehrDataSource() {
        return new DruidDataSource();
    }
}

3.分别为每个数据源创建一个Config,EHR数据源默认为MybatisConfig,YSJ数据源为MybatisConfig1。该配置文件是为了从sqlSessionFactory工厂中获取相应的数据源Dao层bean对象去连接数据库。

3.1 EHR数据源的配置
/**    
 * <p><b>Description: </b></p>
 * <p><b>Date:</b>  Oct 23, 2018 6:51:50 PM </p> 
 * <p><b>Remark:  </b></p>
 */ 
package com.ylkz.DbConfig;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
/**    
 * <p><b>Description: </b></p>
 * <p><b>Date:</b>  Oct 23, 2018 6:51:50 PM </p> 
 * <p><b>Remark: 凡注册到Spring容器内的bean,实现了EnvironmentAware接口重写setEnvironment方法后,
 * 				  在工程启动时可以获得application.properties的配置文件配置的属性值。 </b></p>
 * @author Sean.Wang  
 */
@Configuration
//此处的basePackages 扫描的是我们Dao接口的路径
@MapperScan(basePackages = {"com.ylkz.Mappers.EhrMapper"}, sqlSessionFactoryRef = "ehrSqlSessionFactory")
public class MybatisConfig implements EnvironmentAware {


    private Environment environment;
    
    @Bean(name = "ehrSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("ehrDataSource") DataSource dataSource) {
        try {
            ResourcePatternResolver resourcePatternResolver;
            resourcePatternResolver = new PathMatchingResourcePatternResolver();

            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
             //这里获取的属性其实是mybatis配置文件中的内容,具体的在下面会讲到
            String typeAliasesPackage = environment.getProperty("mybatis.config.typeAliasesPackage");
            String mapperLocations = environment.getProperty("mybatis.config.mapper-locations");
            String configLocation = environment.getProperty("mybatis.config.configLocation");
//            System.out.println("======>" + typeAliasesPackage);
//            System.out.println("======>" + mapperLocations);
//            System.out.println("======>" + configLocation);

            bean.setTypeAliasesPackage(typeAliasesPackage);
            bean.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));
            bean.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
            return bean.getObject();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    @Bean
    public PlatformTransactionManager platformTransactionManager(@Qualifier("ehrDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

	/* (non-Javadoc)  
	 * <p>Description: </p>  
	 * @param arg0  
	 * @see org.springframework.context.EnvironmentAware#setEnvironment(org.springframework.core.env.Environment)  
	 */
	@Override
	public void setEnvironment(Environment arg0) {
		// TODO Auto-generated method stub
		this.environment = arg0;
	}
	
	@Bean(name = "ehrSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("ehrSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
3.2 YSJ数据源的配置
/**
 * <p><b>Description: </b></p>
 * <p><b>Date:</b>  Oct 23, 2018 6:51:50 PM </p>
 * <p><b>Remark:  </b></p>
 */
package com.ylkz.DbConfig1;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

/**
 * <p>
 * <b>Description: </b>
 * </p>
 * <p>
 * <b>Date:</b> Oct 23, 2018 6:51:50 PM
 * </p>
 * <p>
 * <b>Remark: 凡注册到Spring容器内的bean,实现了EnvironmentAware接口重写setEnvironment方法后,
 * 在工程启动时可以获得application.properties的配置文件配置的属性值。 </b>
 * </p>
 *
 * @author Sean.Wang
 */
@Configuration
@MapperScan(basePackages = {
        "com.ylkz.Mappers.YsjMapper"}, sqlSessionFactoryRef = "ysjSqlSessionFactory")
public class MybatisConfig1 implements EnvironmentAware {

    //	这里不能用自动注入,要用下面的方法手动指明配置
    // @Autowired
    // DataSource dataSource;

/*	@Bean(name = "ysjDataSource")
	@ConfigurationProperties(prefix = "druid.datasource.db-ysj")
	public DataSource dataSource() {
		return DataSourceBuilder.create().build();
	}*/

    private Environment environment;

    @Bean(name = "ysjSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("ysjDataSource") DataSource dataSource) {
        try {
            ResourcePatternResolver resourcePatternResolver;
            resourcePatternResolver = new PathMatchingResourcePatternResolver();

            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);

            String typeAliasesPackage = environment.getProperty("mybatis.config1.typeAliasesPackage");
            String mapperLocations = environment.getProperty("mybatis.config1.mapper-locations");
            String configLocation = environment.getProperty("mybatis.config1.configLocation");
            // System.out.println("======>" + typeAliasesPackage);
            // System.out.println("======>" + mapperLocations);
            // System.out.println("======>" + configLocation);

            bean.setTypeAliasesPackage(typeAliasesPackage);
            bean.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));
            bean.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
            return bean.getObject();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Bean
    public PlatformTransactionManager platformTransactionManager(@Qualifier("ysjDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /*
     * (non-Javadoc) <p>Description: </p>
     *
     * @param arg0
     *
     * @see org.springframework.context.EnvironmentAware#setEnvironment(org.
     * springframework.core.env.Environment)
     */
    @Override
    public void setEnvironment(Environment arg0) {
        // TODO Auto-generated method stub
        this.environment = arg0;
    }

    @Bean(name = "ysjSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("ysjSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

4.从第三步时需要获取druid中双数据源相关配置,因而在这里我们说一说其相关的配置信息,在这里我们创建application-db.yml配置文件

# 数据库配置
druid:
  datasource:
    db-ehr:
      driverClassName: ${ehr.driverClassName}
      # 注意:allowMultiQueries=true 开启允许多条sql执行
      url: ${ehr.jdbcurl}
      username: ${ehr.username}
      password: ${ehr.password}
      #初始化连接数量,最大最小连接数
      initialSize: 5
      maxActive: 20
      minIdle: 5
      #获取连接等待超时的时间
      maxWait: 600000
      #超过时间限制是否回收
      removeAbandoned: true
      #超过时间限制多长
      removeAbandonedTimeout: 180
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 600000
      #配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      #用来检测连接是否有效的sql,要求是一个查询语句
      validationQuery: SELECT 1 FROM sys_user
      #申请连接的时候检测
      testWhileIdle: true
      #申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能
      testOnBorrow: false
      #归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能
      testOnReturn: false
      #打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 50
      #属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
      #监控统计用的filter:stat 日志用的filter:log4j 防御SQL注入的filter:wall
      filters: stat
    db-ysj:
      driverClassName: ${ysj.driverClassName}
      # 注意:allowMultiQueries=true 开启允许多条sql执行
      url: ${ysj.jdbcurl}
      username: ${ysj.username}
      password: ${ysj.password}
      #初始化连接数量,最大最小连接数
      initialSize: 5
      maxActive: 20
      minIdle: 5
      #获取连接等待超时的时间
      maxWait: 600000
      #超过时间限制是否回收
      removeAbandoned: true
      #超过时间限制多长
      removeAbandonedTimeout: 180
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 600000
      #配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      #用来检测连接是否有效的sql,要求是一个查询语句
      validationQuery: SELECT 1 FROM code_post
      #申请连接的时候检测
      testWhileIdle: true
      #申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能
      testOnBorrow: false
      #归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能
      testOnReturn: false
      #打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 50
      #属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
      #监控统计用的filter:stat 日志用的filter:log4j 防御SQL注入的filter:wall
      filters: stat

mybatis:
  config:
    typeAliasesPackage: com.ylkz.Beans.Ehr  #此处是实体的具体扫描路径
    mapper-locations: classpath:mybatis/ehrMapper/*Mapper.xml #这里是具体的Mapper.xml文件的扫描地址
    configLocation: classpath:mybatis-spring.xml  #这里是mybatis的具体配置文件地址或者具体的配置文件
  config1:
    typeAliasesPackage: com.ylkz.Beans.Yjs
    mapper-locations: classpath:mybatis/ysjMapper/*Mapper.xml
    configLocation: classpath:mybatis-spring.xml

5.在上一部druid双数据源配置中引用到了mybatis的配置,这里是具体的描述信息mybatis-spring.xml,项目中直接引用的xml文件直接放在resources目录下。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <properties>
        <property name="dialect" value="mysql" />
    </properties>
    <settings>
        <!-- 这个配置使全局的映射器启用或禁用缓存。系统默认值是true,设置只是为了展示出来 -->
        <setting name="cacheEnabled" value="true" />
        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 系统默认值是true,设置只是为了展示出来 -->
        <setting name="lazyLoadingEnabled" value="false" />
        <!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)。 系统默认值是true,设置只是为了展示出来 -->
        <setting name="multipleResultSetsEnabled" value="true" />
        <!--使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动。 系统默认值是true,设置只是为了展示出来 -->
        <setting name="useColumnLabel" value="true" />
        <!--允许 JDBC 支持生成的键。需要适合的驱动。如果设置为 true 则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如
            Derby)。 系统默认值是false,设置只是为了展示出来 -->
        <setting name="useGeneratedKeys" value="false" />
        <!--配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 系统默认值是SIMPLE,设置只是为了展示出来 -->
        <setting name="defaultExecutorType" value="SIMPLE" />
        <!--设置超时时间,它决定驱动等待一个数据库响应的时间。 系统默认值是null,设置只是为了展示出来 -->
        <setting name="defaultStatementTimeout" value="25000" />
    </settings>
    <!--<plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="mysql" />
            <property name="offsetAsPageNum" value="true" />
            <property name="rowBoundsWithCount" value="true" />
            <property name="pageSizeZero" value="true" />
            <property name="reasonable" value="true" />
        </plugin>
    </plugins>-->
</configuration>
在这里插入代码片

在本文中介绍了具体的Dao层对象创建的配置文件MybatisConfig,Druid双数据源的配置文件application-db.yml(其中讲述了实体entity,mapper文件sql语句的具体路径配置),mybatis的配置文件mybatis-spring.xml ,以及springboot项目中启动类的配置 。谢谢大家。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/80433.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!