• SpringBoot 集成 Impala + mybatis + druid


    1. 获取依赖
    Impala的依赖在maven仓库下载不了,需要自己去官网下载: https://www.cloudera.com/downloads/connectors/impala/jdbc/2-6-3.html , 麻烦可直接去博主的GitHub项目中获取

    2. 配置Druid连接池
    Druid依赖:

    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
    </dependency> 
    连接池配置:

    # 数据源
    datasource:
    driver-class-name: com.cloudera.impala.jdbc41.Driver
    url: jdbc:impala://192.168.1.101:21050/default
    username: root
    password: root
    # Druid连接池配置
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
    # 初始化
    initial-size: 3
    # 最大
    max-wait: 10
    # 最小
    min-idle: 3
    # 最大连接等待超时时间
    max-active: 60000
    # 周期性剔除长时间呆在池子里未被使用的空闲连接, 1 min 一次,单位毫秒
    time-between-eviction-runs-millis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    min-evictable-idle-time-millis: 300000
    # 设置连接在池中最大存活时长,超过上限才会被清理
    max-evictable-idle-time-millis: 600000
    # 验证连接是否可用,使用的SQL语句
    validation-query: SELECT 'x'
    # 连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.
    test-while-idle: true
    # 借出连接时不要测试,否则很影响性能
    test-on-borrow: false
    # 指明是否在归还到池中前进行检验
    test-on-return: false 
    初始化的连接一定要大于1,否则第一次查询时会出现这类错误:
    Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10, active 1, maxActive 60000, creating 1, createElapseMillis 21
    有的通过设置 remove-abandoned、remove-abandoned-timeout 这两个参数来处理这个问题,别人的我不知道,反正我遇到的时候这个设置是不能解决的。

    3. 集成Pagehelper分页插件
    yml文件中的配置:

    #pagehelper
    pagehelper:
    helperDialect: impala
    reasonable: true
    supportMethodsArguments: true
    params: count=countSql
    offsetAsPageNum: true
    pageSizeZero: true
    # dialectAlias: mysql=com.github.pagehelper.dialect.helper.MySqlDialect mysql采用的方式
    dialectAlias: impala=com.github.pagehelper.dialect.helper.HsqldbDialect 
    HsqldbDialect 会采用 offset的方式来分页,impala也只支持offset方式,不支持limit 1, 10 这种方式。

    代码中的使用方式:

    /**
    * 根据分页、排序信息和检索条件查询 @size 条 日志数据
    * @param pageParam 分页参数
    * @param queryDTO 查询条件
    * @return
    */
    @Override
    public List<CrashLog> list(PageParam pageParam, QueryDTO queryDTO) {
    Integer size = pageParam.getSize();
    Integer page = pageParam.getPage();
    pageParam.setPage(( page - 1 ) * size);
    PageHelper.startPage(page, size);
    PageHelper.orderBy("`timestamp` desc ");
    Example example = new Example(CrashLog.class);
    if (null != queryDTO){
    if (StringUtils.isNotEmpty(queryDTO.getAppid())){
    example.and().andEqualTo("appid", queryDTO.getAppid());
    }
    }
    List<CrashLog> crashLogs = crashLogMapper.selectByExample(example);
    return crashLogs;

    impala分页时必须要排序,因此需要指定排序字段和顺序

    4. 集成mybatis 和 通用mapper
    这些配置都一样,没什么新鲜的,不明白的可参考我这篇博客:https://blog.csdn.net/qq_34997906/article/details/99745892

    ### Mybatis Config ###
    mybatis:
    check-config-location: true
    typeAliasesPackage: com.example.janche.**.domain
    mapperLocations: classpath:mapper/**/*.xml
    type-handlers-package: com.example.janche.common.mybatis.handler.*
    ### 通用 Mapper ###
    mapper:
    IDENTITY: mysql
    notEmpty: false
    mappers:
    - com.example.janche.common.core.Mapper
    - com.example.janche.common.core.TkMapper 
    5. 遇到的问题
    impala服务重启后,springboot项目获取不到连接,导致查询报错的问题

    1. impala重启后,连接池中的连接还没有销毁时访问:将出现下面的异常:
    Cause: java.sql.SQLException: [Cloudera][ImpalaJDBCDriver](500593) Communication link failure. Failed to connect to server. Reason: Unknown.
    Cause: java.sql.SQLException: [Cloudera][ImpalaJDBCDriver](500593) Communication link failure. Failed to connect to server. Reason: java.net.SocketException: Software caused connection abort: socket write error.
    Caused by: com.cloudera.impala.jdbc41.internal.apache.thrift.transport.TTransportException
    解决方式:此时需要等待Druid连接池自动剔除呆在池子里未被使用的空闲连接,也就是上面配置的1分钟,1分钟后,再次查询就能自动查到了,所以,出现此异常后,可捕获异常,等待一分钟后才让页面可以查询。有很多小伙伴配置了Druid连接池但实际上是不生效的,注意观察yml文件的颜色变化。

    2. impala重启后,连接池中的连接已经销毁后访问:第一次访问也会有如下异常,后续在访问就不会了,虽然第一次有异常打印,但是能够正常获取到请求结果,不影响程序的正常执行:
    Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10, active 1, maxActive 60000, creating 1, createElapseMillis 21
    解决方式:不影响程序正常运行,可忽略

    源码地址:https://github.com/Janche/spring-boot-impala.git 有帮助的话,记得star哟


    ————————————————
    版权声明:本文为CSDN博主「弦上的梦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_34997906/article/details/108752222

  • 相关阅读:
    PHP抓取页面的几种方式
    MySQL性能优化的最佳20+条经验
    linux下导入、导出mysql数据库命令
    8个必备的PHP功能开发
    jquery中的children()和contents()的区别
    centos 通用开发工具及库安装 有了它不用愁了
    将bat批处理文件注册成windows服务
    squid隐藏squid的版本号
    squid如何屏蔽User-Agent为空的请求
    RHEL/CentOS 6.x使用EPEL6与remi的yum源安装MySQL 5.5.x
  • 原文地址:https://www.cnblogs.com/javalinux/p/14832290.html
Copyright © 2020-2023  润新知