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