springboot配置多数据源(mysql、hive)

MyBatis-Plus 不能也不建议同时去"控制" Hive 。它从设计到实现都假定底层是 支持事务、支持标准 SQL 方言关系型数据库(MySQL、PostgreSQL、Oracle、SQL Server 等),而 Hive 两者都不完全符合。如果操作两个数据源都是mysql或者和关系数据库的组合就可以了。以下主要介绍操作mysql和hive的方案。

1.引入依赖

XML 复制代码
//mysql的数据源
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
             <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
</dependency>

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.7</version>
        </dependency>

//hive的依赖,我们这里用的星环的指定的本地的lib,其他可以直接根据公司的实际版本等情况去配置即可

2.添加配置yml

XML 复制代码
spring:
  datasource:
    mysql:
      url: jdbc:mysql://4555555:5555/sxxxx?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
      username: root
      password: rorot
      driver-class-name: com.mysql.cj.jdbc.Driver
      type: com.zaxxer.hikari.HikariDataSource  # 显式指定
      hikari:
        # 最大连接数
        maximum-pool-size: 10
        # 最小空闲连接数
        minimum-idle: 5
        # 连接获取超时时间(30秒)
        connection-timeout: 30000
        # 空闲超时时间(10分钟)
        idle-timeout: 600000
        # 最大连接寿命(30分钟)
        max-lifetime: 1800000
        pool-name: mysql-pool  # 连接池名称(便于监控)
    hive:
      url: jdbc:hive2://your-hive-server:10000/default
      username: hive
      password: hive
      driver-class-name: org.apache.hive.jdbc.HiveDriver
      type: com.zaxxer.hikari.HikariDataSource # 显式指定
      hikari:
        # Hive连接数通常较少(查询较慢)
        maximum-pool-size: 5
        # 最小空闲连接数
        minimum-idle: 2
        # Hive查询可能较慢,适当延长超时
        connection-timeout: 60000
        # 空闲连接超时(5分钟)
        idle-timeout: 300000
        # 最大连接寿命(30分钟)
        max-lifetime: 1800000
        pool-name: hive-pool

3.添加配置类DataSourceConfig和MyBatisPlusConfig

先添加DataSourceConfig,主要是告知spring我们有两个数据源,分别叫什么名称(bean),并且我们的hive交给我们的jdbctemplate去管理。在添加MyBatisPlusConfig,主要是把mysql交给mybatisplus去控制

java 复制代码
package com.sjztdz.selectprovincetrace.selecttrace.config;

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;


@Configuration
public class DataSourceConfig {

    // MySQL数据源配置
    @Bean("mysqlDataSource")
    @ConfigurationProperties(prefix="spring.datasource.mysql")
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    // Hive数据源配置
    @Bean("hiveDataSource")
    @ConfigurationProperties(prefix="spring.datasource.hive")
    public DataSource hiveDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    // Hive配置jdbctemplate hive一般不需要事务
    @Bean("hiveJdbcTemplate")
    public JdbcTemplate hiveJdbcTemplate(@Qualifier("hiveDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}
java 复制代码
package com.sjztdz.selectprovincetrace.selecttrace.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;


/**
 * MySQL 专属配置类
 * 1. 只扫 MySQL 的 Mapper 接口(@MapperScan)
 * 2. 给 MySQL 单独建一个 SqlSessionFactory 和事务管理器
 * 3. 加载 MyBatis-Plus 分页插件
 */
@Configuration
@MapperScan(basePackages = "com.xxxxx.selecttrace.mapper", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MyBatisPlusConfig {


    @Bean("mysqlSqlSessionFactory")
    public SqlSessionFactory mysqlSqlSessionFactory(
            @Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
        //用 MyBatis-Plus 自己的工厂bean,才能识别 MP 的注解和扩展
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        //告诉工厂用那个数据源--mysql
        sessionFactory.setDataSource(dataSource);
        //告诉工厂去哪里找 XML 映射文件
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**.xml")
        );
        // 分页插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        sessionFactory.setPlugins(interceptor);
        return sessionFactory.getObject();
    }

    /**
     * 给 MySQL 再配一个独立的事务管理器
     * 以后在 Service 层想只控制 MySQL 事务时,写:
     *   @Transactional("mysqlTransactionManager")
     * 就不会误伤到 Hive 或其它数据源
     */
    @Bean("mysqlTransactionManager")
    public PlatformTransactionManager mysqlTransactionManager(
            @Qualifier("mysqlDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

注意@Qualifie的使用就针对多数个类去实现同一个接口时候,防止我们找错!

4.使用

mysql-mybatis的使用

java 复制代码
@Service
public class MysqlUserService {

    @Autowired
    private UserMapper userMapper; // MyBatis-Plus Mapper

    public List<User> getUsers() {
        return userMapper.selectList(Wrappers.emptyWrapper());
    }

    public void addUser(User user) {
        userMapper.insert(user);
    }
}

hive-jdbcTemplate的使用

java 复制代码
@Service
public class HiveQueryService {

    @Autowired
    private JdbcTemplate hiveJdbcTemplate;

    public List<Map<String, Object>> queryHiveData(String sql) {
        return hiveJdbcTemplate.queryForList(sql);
    }

    public void executeHiveDDL(String ddl) {
        hiveJdbcTemplate.execute(ddl);
    }
}
相关推荐
MC丶科9 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
@yanyu66610 小时前
idea中配置tomcat
java·mysql·tomcat
lang2015092810 小时前
Spring Boot 入门:5分钟搭建Hello World
java·spring boot·后端
Javashop_jjj11 小时前
三勾软件| 用SpringBoot+Element-UI+UniApp+Redis+MySQL打造的点餐连锁系统
spring boot·ui·uni-app
starfalling102412 小时前
【hive】一种高效增量表的实现
hive
PHP源码12 小时前
SpringBoot校园二手商城系统
java·spring boot·springboot二手商城·java校园二手商城系统
毕业设计制作和分享12 小时前
springboot159基于springboot框架开发的景区民宿预约系统的设计与实现
java·spring boot·后端
MC丶科14 小时前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
hello_zzw14 小时前
docker部署MySQL主从服务集群
mysql·adb·docker