簡介
在項目實踐中,同一個項目可能需要整合多種數據源,把分散到各個數據庫、數據表的數據都查詢統計出來;
SpringBoot有默認的數據源配置,本篇博客將整合SpringBoot多數據源配置,包括mysql、hive等,通過jdbctemplate或mybatis進行使用;
版本配置(版本可自行選擇,這里是博主的測試版本):jdk1.8,springboot1.5.9,hive2.1.1,hadoop2.7.6,mysql5.7;
實踐
首先,pom文件引入依賴:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring.version>4.3.9.RELEASE</spring.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!-- 添加mybatis支持 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 添加mysql驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 添加數據庫連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<!-- 添加spring管理bean對象 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<!-- 添加hadoop依賴 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-common</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 添加hive依賴 -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.1.1</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
yml配置多個數據源屬性和數據庫連接池通用屬性:
#配置mybatis
mybatis:
mapperLocations: classpath:/com/springboot/sixmonth/dao/mapper/**/*.xml
#配置多個數據源屬性(這里只配置兩個,有需要可自行新增)
spring:
datasource:
mysqlMain: #mysql主數據源,可關聯mybatis
type:
com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/master?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=true&rewriteBatchedStatements=true
username: root
password: 1234
driver-class-name: com.mysql.jdbc.Driver
hive: #hive數據源
url: jdbc:hive2://47.100.200.200:9019/default
type: com.alibaba.druid.pool.DruidDataSource
username: sixmonth
password: sixmonth
driver-class-name: org.apache.hive.jdbc.HiveDriver
commonConfig: #連接池統一配置,應用到所有的數據源
initialSize: 1
minIdle: 1
maxIdle: 5
maxActive: 50
maxWait: 10000
timeBetweenEvictionRunsMillis: 10000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
filters: stat
新建以下相關類:
HiveDruidConfig(hive數據庫連接池配置);
MysqlMainDruidConfig(mysql主數據源數據連接池配置);
DataSourceCommonProperties(擴展連接池配置屬性,應用到所有的數據源);
DataSourceProperties(統一屬性控制類,獲取配置文件屬性);
HiveJdbcBaseDaoImpl(jdbctemplate注入hive數據源);
MysqlMainJdbcBaseDaoImpl(jdbctemplate注入mysql數據源);
新建HiveDruidConfig:
package com.springboot.sixmonth.common.config.druid.hive;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.druid.pool.DruidDataSource;
import com.springboot.sixmonth.common.config.druid.DataSourceCommonProperties;
import com.springboot.sixmonth.common.config.druid.DataSourceProperties;
/**
* -配置hive數據源
* @author sixmonth
* @Date 2019年5月18日
*
*/
@Configuration
@EnableConfigurationProperties({DataSourceProperties.class,DataSourceCommonProperties.class})//將配置類注入到bean容器,使ConfigurationProperties注解類生效
public class HiveDruidConfig {
private static Logger logger = LoggerFactory.getLogger(HiveDruidConfig.class);
@Autowired
private DataSourceProperties dataSourceProperties;
@Autowired
private DataSourceCommonProperties dataSourceCommonProperties;
@Bean("hiveDruidDataSource") //新建bean實例
@Qualifier("hiveDruidDataSource")//標識
public DataSource dataSource(){
DruidDataSource datasource = new DruidDataSource();
//配置數據源屬性
datasource.setUrl(dataSourceProperties.getHive().get("url"));
datasource.setUsername(dataSourceProperties.getHive().get("username"));
datasource.setPassword(dataSourceProperties.getHive().get("password"));
datasource.setDriverClassName(dataSourceProperties.getHive().get("driver-class-name"));
//配置統一屬性
datasource.setInitialSize(dataSourceCommonProperties.getInitialSize());
datasource.setMinIdle(dataSourceCommonProperties.getMinIdle());
datasource.setMaxActive(dataSourceCommonProperties.getMaxActive());
datasource.setMaxWait(dataSourceCommonProperties.getMaxWait());
datasource.setTimeBetweenEvictionRunsMillis(dataSourceCommonProperties.getTimeBetweenEvictionRunsMillis());
datasource.setMinEvictableIdleTimeMillis(dataSourceCommonProperties.getMinEvictableIdleTimeMillis());
datasource.setValidationQuery(dataSourceCommonProperties.getValidationQuery());
datasource.setTestWhileIdle(dataSourceCommonProperties.isTestWhileIdle());
datasource.setTestOnBorrow(dataSourceCommonProperties.isTestOnBorrow());
datasource.setTestOnReturn(dataSourceCommonProperties.isTestOnReturn());
datasource.setPoolPreparedStatements(dataSourceCommonProperties.isPoolPreparedStatements());
try {
datasource.setFilters(dataSourceCommonProperties.getFilters());
} catch (SQLException e) {
logger.error("Druid configuration initialization filter error.", e);
}
return datasource;
}
}
新建MysqlMainDruidConfig類:
package com.springboot.sixmonth.common.config.druid.mysqlMain;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
import com.springboot.sixmonth.common.config.druid.DataSourceCommonProperties;
import com.springboot.sixmonth.common.config.druid.DataSourceProperties;
/**
* -配置mysql主數據源,mysql連接默認主數據源
* @author sixmonth
* @Date 2019年5月18日
*
*/
@Configuration
@EnableConfigurationProperties({DataSourceProperties.class,DataSourceCommonProperties.class})//將配置類注入到bean容器,使ConfigurationProperties注解類生效
public class MysqlMainDruidConfig {
private static Logger logger = LoggerFactory.getLogger(MysqlMainDruidConfig.class);
@Autowired
private DataSourceProperties dataSourceProperties;
@Autowired
private DataSourceCommonProperties dataSourceCommonProperties;
@Primary //標明為主數據源,只能標識一個主數據源,mybatis連接默認主數據源
@Bean("mysqlDruidDataSource") //新建bean實例
@Qualifier("mysqlDruidDataSource")//標識
public DataSource dataSource(){
DruidDataSource datasource = new DruidDataSource();
//配置數據源屬性
datasource.setUrl(dataSourceProperties.getMysqlMain().get("url"));
datasource.setUsername(dataSourceProperties.getMysqlMain().get("username"));
datasource.setPassword(dataSourceProperties.getMysqlMain().get("password"));
datasource.setDriverClassName(dataSourceProperties.getMysqlMain().get("driver-class-name"));
//配置統一屬性
datasource.setInitialSize(dataSourceCommonProperties.getInitialSize());
datasource.setMinIdle(dataSourceCommonProperties.getMinIdle());
datasource.setMaxActive(dataSourceCommonProperties.getMaxActive());
datasource.setMaxWait(dataSourceCommonProperties.getMaxWait());
datasource.setTimeBetweenEvictionRunsMillis(dataSourceCommonProperties.getTimeBetweenEvictionRunsMillis());
datasource.setMinEvictableIdleTimeMillis(dataSourceCommonProperties.getMinEvictableIdleTimeMillis());
datasource.setValidationQuery(dataSourceCommonProperties.getValidationQuery());
datasource.setTestWhileIdle(dataSourceCommonProperties.isTestWhileIdle());
datasource.setTestOnBorrow(dataSourceCommonProperties.isTestOnBorrow());
datasource.setTestOnReturn(dataSourceCommonProperties.isTestOnReturn());
datasource.setPoolPreparedStatements(dataSourceCommonProperties.isPoolPreparedStatements());
try {
datasource.setFilters(dataSourceCommonProperties.getFilters());
} catch (SQLException e) {
logger.error("Druid configuration initialization filter error.", e);
}
return datasource;
}
}
新建DataSourceCommonProperties類:
package com.springboot.sixmonth.common.config.druid;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* -擴展連接池,通用配置屬性,可應用到所有數據源
* @author sixmonth
* @Date 2019年5月18日
*
*/
@ConfigurationProperties(prefix = DataSourceCommonProperties.DS, ignoreUnknownFields = false)
public class DataSourceCommonProperties {
final static String DS = "spring.datasource.commonConfig";
private int initialSize = 10;
private int minIdle;
private int maxIdle;
private int maxActive;
private int maxWait;
private int timeBetweenEvictionRunsMillis;
private int minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxOpenPreparedStatements;
private String filters;
private String mapperLocations;
private String typeAliasPackage;
//為節省空間,這里省略set和get方法,可自行添加
}
新建DataSourceProperties類:
package com.springboot.sixmonth.common.config.druid;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* -統一屬性控制類,獲取配置文件屬性
* @author sixmonth
* @Date 2019年5月18日
*
*/
@ConfigurationProperties(prefix = DataSourceProperties.DS, ignoreUnknownFields = false)
public class DataSourceProperties {
final static String DS = "spring.datasource";
private Map<String,String> mysqlMain;
private Map<String,String> hive;
private Map<String,String> commonConfig;
//為節省空間,這里省略set和get方法,可自行添加
}
新建HiveJdbcBaseDaoImpl類:
package com.springboot.sixmonth.common.config.jdbcConfig;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
/**
* -注入hive數據源
* @author sixmonth
* @Date 2019年5月18日
*
*/
@Repository
public class HiveJdbcBaseDaoImpl {
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
@Autowired
public void setJdbcTemplate(@Qualifier("hiveDruidDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
}
新建MysqlMainJdbcBaseDaoImpl類:
package com.springboot.sixmonth.common.config.jdbcConfig;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
/**
* -注入jdbctemplate
* @author sixmonth
* 2018年11月12日
*/
@Repository
public class MysqlMainJdbcBaseDaoImpl {
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
@Autowired
public void setJdbcTemplate(@Qualifier("mysqlDruidDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
}
新建測試類TestDao,測試jdbcTemplate連接使用mysql:
package com.springboot.sixmonth.dao.jdbcDao.test;
import org.springframework.stereotype.Repository;
import com.springboot.sixmonth.common.config.jdbcConfig.MysqlMainJdbcBaseDaoImpl;
/**
* -測試jdbc連接
* @author sixmonth
* @Date 2019年5月20日
*
*/
@Repository
public class TestDao extends MysqlMainJdbcBaseDaoImpl{
/**
* -測試類
* @return
*/
public String test() {
String sql = "SELECT username from sys_user where username='admin'";
String param = this.getJdbcTemplate().queryForObject(sql,String.class);
return param;
}
}
新建測試類TestHiveDao,測試jdbcTmplate連接使用hive:
package com.springboot.sixmonth.dao.jdbcDao.test;
import org.springframework.stereotype.Repository;
import com.springboot.sixmonth.common.config.jdbcConfig.HiveJdbcBaseDaoImpl;
/**
* -測試hive連接
* @author sixmonth
* @Date 2019年5月18日
*
*/
@Repository
public class TestHiveDao extends HiveJdbcBaseDaoImpl{
/**
* 測試獲取hive數據庫數據信息
* @return
*/
public String test() {
String sql = "SELECT name from sixmonth limit 1";
String param = this.getJdbcTemplate().queryForObject(sql,String.class);
return param;
}
}
使用方法:
@Autowired
private TestDao testDao;
@Autowired
private TestHiveDao testHiveDao;
總結
SpringBoot可以配置多個mysql數據源,也可以配置多種數據源,比如hive、oracle等,需要可自行添加;
在整合mybatis的時候需要標明主數據源,默認使用數據源;
實踐是檢驗認識真理性的唯一標准,自己動手,豐衣足食~~
————————————————
版權聲明:本文為CSDN博主「塵光掠影」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/alan_liuyue/article/details/90370844
