IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> springboot多数据源整合impala druid连接池问题 -> 正文阅读

[Java知识库]springboot多数据源整合impala druid连接池问题

项目场景:

项目数据源迁移,springboot整合impala时,发现druid部分参数未被正常识别,导致impala会话失效或重启后,应用无法连接impala发生报错

druid版本是1.1.10


问题描述

具体错误可能有如下几种:

  • 第一种
### Error querying database. Cause:java.sql.SQLException:[Cloudera][ImpalaJDBCDriver]
(500051)Error processing query/statement. Error code:0, SQL state: TStatus(statusCode:
ERROR_STATUS,sqlState:HY000, errorMessage:Invalid session id: d04e2043a21fedcc:
3f5634a7b2b56bbf
  • 第二种
Caused by:com.cloudera.impala.support.exceptions.ErrorException:[Cloudera]
[ImpalaJDBCDriver](500593)Communication link failure. Failed to connect to server.
Reason:java.net.SocketException:Software caused connection abort:socket write error.
ExecuteStatment for query "select

第一种是impala的会话失效后,应用请求接口发生的错误,Invalid session(无效会话)

第二种是impala重启后,应用请求接口发生的错误,Failed to connect to server(无法连接至服务)

以上几种无非都是同一种原因,druid在发现连接不通时并没有销毁目前线程去重新创建连接

错误应该不止这几种的,但是导致这类错误的原因应该是差不多的


原因分析:

提示:这里填写问题的分析:

分析下原因:用druid连接池的小伙伴们都知道有两个参数是timeBetweenEvictionRunsMillisvalidationQuery,那么第一个参数的含义是配置间隔多久才进行一次检测,检测需要关闭的空闲连接(单位毫秒),第二个则是验证连接可用,我们配置普通数据库的时候在配置文件中直接加入这两个参数即可,但目前的实际情况它们好像并没有起作用

经过一段时间测试,我发现当连接不可用时druid并没有校验其可用性,也没有关闭空闲连接,于是便从这里着手解决问题,先放出我的配置文件datasource部分的参数

注意我这里是整合了Oracle和Impala,以下所有数据库ip和库名皆为虚拟,自行替换即可

spring: 
  datasource: 
    app: 
      oracle: 
        driver-class-name: oracle.jdbc.OracleDriver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:oracle:thin:@//127.0.0.1:1521/test
        username: root
        password: root
    druid: 
      # 连接池的配置
      # 初始化大小
      initial-size: 5
      min-idle: 5
      # 配置获取连接等待超时的时间
      maxActive: 20
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      validationQuery: select 1
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 通过connectProperties属性来打开mereSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      impala: 
        url: jdbc:impala://127.0.0.1:21050/bigdate;AuthMech=3
        driver-class-name: com.cloudera.impala.jdbc41.Driver
        username: hive
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
      

解决方案:

提示:这里填写该问题的具体解决方案:

知道了问题原因接下来便是解决方案了,来看一下我的部分配置类,根据问题做了改造

继续来看部分配置类,所有涉及到项目信息相关内容都已替换

@Configuration
@MapperScan(valud = "com.test.test.test.impaladao", sqlSessionFactoryRef = "ImpalaSessionFactory")
public class ImpalaDatabaseSource {
	@Value("${spring.datasource.druid.impala.url}")
	private String url;
	@Value("${spring.datasource.druid.impala.driver-class-name}")
	private String driverClass;
	@Value("${spring.datasource.druid.impala.username}")
	private String username;
	@Value("${spring.datasource.druid.impala.password}")
	private String password;
	@Value("${spring.datasource.druid.maxActive}")
	private Integer maxActive;
	@Value("${spring.datasource.druid.initial-size}")
	private Integer initialSize;
	@Value("${spring.datasource.druid.min-idle}")
	private Integer minIdle;
	@Value("${spring.datasource.druid.maxWait}")
	private Integer maxWait;
	@Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
	private Long timeBetweenEvictionRunsMillis;
	@Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
	private Long minEvictableIdleTimeMillis;
	@Value("${spring.datasource.druid.validationQuery}")
	private String validationQuery;
	@Value("${spring.datasource.druid.testWhileIdle}")
	private Boolean testWhileIdle;
	@Value("${spring.datasource.druid.testOnBorrow}")
	private Boolean testOnBorrow;
	@Value("${spring.datasource.druid.testOnReturn}")
	private Boolean testOnReturn;
	@Value("${mybatis.typeAliasesPackage}")
	private String aliasesPackage;
	@Value("${mybatis.mapper-locations}")
	private String locations;
	
	@Bean(name="impalaDataSource")
	public DataSource impalaDataSource() {
		DruidDataSource dataSource = new DruidDataSource();
		dataSource.setDriverClassName(driverClass);
		dataSource.setUrl(url);
		dataSource.setUsername(username);
		dataSource.setPassword(password);
		dataSource.setMaxActive(maxActive);
		dataSource.setInitialSize(initialSize);
		dataSource.setMinIdle(minIdle);
		dataSource.setMaxWait(maxWait);

		dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
		dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
		dataSource.setValidationQuery(validationQuery);
		dataSource.setTestWhileIdle(testWhileIdle);
		dataSource.setTestOnBorrow(testOnBorrow);
		dataSource.setTestOnReturn(testOnReturn);
		return dataSource;
	}
}

这边可以看到我把配置文件中的几个检测连接的重要属性都放到了配置类中,这样就可以识别了

不过需要注意的是validationQuery这个参数我给的值是select 1,这是为了适配impala,oracle不一定能够识别,如果两个数据源都要用的小伙伴建议单独写

做完这些后把项目重新发布一下就能够正常使用了

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-26 16:47:16  更:2022-06-26 16:47:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:46:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码