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