1. 获取依赖

Impala的依赖在maven仓库下载不了,需要自己去官网下载:

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

解决方式:不影响程序正常运行,可忽略