当前位置: 代码迷 >> 综合 >> SpringBoot 集成 Impala + mybatis + druid
  详细解决方案

SpringBoot 集成 Impala + mybatis + druid

热度:114   发布时间:2023-10-25 17:04:33.0

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.Driverurl: jdbc:impala://192.168.1.101:21050/defaultusername: rootpassword: root# Druid连接池配置type: com.alibaba.druid.pool.DruidDataSourcedruid:# 初始化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-abandonedremove-abandoned-timeout 这两个参数来处理这个问题,别人的我不知道,反正我遇到的时候这个设置是不能解决的。

3. 集成Pagehelper分页插件

yml文件中的配置:

#pagehelper
pagehelper:helperDialect: impalareasonable: truesupportMethodsArguments: trueparams: count=countSqloffsetAsPageNum: truepageSizeZero: 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: truetypeAliasesPackage: com.example.janche.**.domainmapperLocations: classpath:mapper/**/*.xmltype-handlers-package: com.example.janche.common.mybatis.handler.*
###   通用 Mapper  ###
mapper:IDENTITY: mysqlnotEmpty: falsemappers:- 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哟

  相关解决方案