【华为云技术分享】实战笔记丨JDBC问题定位指南

JDBCJava数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集。JDBC1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批组件之一。

 

JDBC问题基础知识

JDBC问题是指比较宽泛的,体现在JDBC层面的问题造成JDBC问题的原因主要是三个方面:1、应用程序和应用程序框架问题;2JDBC业务功能问题;3数据库内核问题。问题表现可以分为个大的方面:1、执行报错JDBC抛出异常;2、执行效率低,耗时异常;3特性不支持,JDBC未实现的JDK接口

 

JDBC问题分类

问题分类

问题原因

建立数据库链接失败

JDBC客户端配置问题,URL格式不对或者用户名密码错误等问题

网络不通

Jar包冲突

内核配置问题,内核未配置远程访问权限

执行业务异常

传入SQL有误,内核不支持

内核bug,业务处理异常,返回异常报文

网络故障

数据库链接超时,socket已关闭

性能问题

 

SQL内核执行

结果集过大,导致应用程序段响应慢

用户传入SQL过长JDBC解析慢

功能支持问题

 

JDK提供标准接口

JDBC实现接口

 

JDBC问题定位方法及解决措施

建立数据库链接失败

1 关键字Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.  客户端ping服务端IP,看网络是否畅通,网络不通首先解决网络问题然后查看端口是否正确,端口不正确修改为正确的端口;

2 关键字FATAL: Invalid username/password,login denied.  检查用户名密码的配置是否正确。措施:将其修改为正确的用户名密码。

3 关键字No suitable driver found for XXXX   检查URL格式是否正确措施:将其修改为正确的格式gsjdbc4.jar对应 jdbc:postgresql://host:port/database, gsjdbc200.jar对应jdbc:gaussdb://host:port/database

4 关键字FATAL: no pg_hba.conf entry for host  检查所链接CN是否配置远程访问权限,在cn下的pg_hba.conf文件中添加host all all 0.0.0.0/0 sha256

5 关键字conflit   JDBC jar包和应用程序冲突措施:将gsjdbc4.jar替换为gsjdbc200.jar

 

执行业务异常

1 关键字receiveErrorResponse 若报错中含有次关键字,则JDBC报错是接收到了内核发来的异常报文和异常信息, 措施:需要收集相关报错及日志信息发回研发分析。

2 关键字:Broken pipe, connection reset by peer 可能原因:网络故障,数据库链接超时,措施:检查网络状态,修复网络故障,影响数据库链接超时的因素,数据库参数session_timeout以及lvs

3 关键字:The column index is out of range 可能原因:应用程序获取的结果集和预期不一致,列数不一致,应用程序问题 措施:检查数据库表定义和查询sql,对返回结果集做一个正确预期,若结果集只有3列,取值时传入的index最大为3。

 

性能问题

1 设置loglevel=3打开jdbc日志,若主要耗时在processResult阶段,可分为两种情况:1)jdbc端一直等待内核返回的报文,等待时间较长; 判断方法:查看FE=> Syncr日志和<=BE ParseComplete日志之间的时间间隔,若时间间隔较久,则判断是内核执行慢;措施需要内核人员分析sql执行慢的原因;2结果集过大,一次性全部加载,消耗大量时间;判断方法:看日志<=BE DataRow出现次数特别多,或则直接在gsql里执行select count(*)查询出来的数目特别大,则判断是结果集过大; 措施:设置fetchSize参数一个较小的值,使数据按批次返回,客户端得到快速响应。

2 若主要耗时在modifyJdbcCall(校验传入的sql是否符合规范)和createParameterizedQuery(将传入的sql解析为preparedQuery,以获取由simplequery组成的subqueries)阶段,则需要看一下传入的sql是不是过长,措施:jdbc本身没办法优化这部分耗时,需要应用端看下是否可以优化传入的sql

 

功能问题

1 关键字:not yet implemented JDBC未实现接口,措施:需要研究一下是否可实现,是否需要落需求或则是否有其他接口提供相同功能,调整业务使用已提供接口。

2 JDK标准接口中未提供功能,JDK提供标准接口措施:理论上,JDK未提供接口JDBC不支持,实际使用中可以使用JDBC类中的public方法获取部分过程数据绝大部分情况下明确不支持。

 

常见案例

加载驱动失败

客户在使用JDBC的时候往往不是直接通过Java程序加载驱动建立链接,而是通过应用程序框架,做好配置之后通过应用程序框架自动建立链接,可能会由于配置问题导致建立链接失败,如:使用了gsjdbc200.jar但是加载的驱动仍然是org.postgresql.Driver后者使用的url格式仍然是jdbc:postgresql由于是应用程序框架加载的,所以有些时候驱动路径和url格式都是固定的,只允许配置ipportuserpassword基本信息,并且在出错的时候只能看见建立链接失败的log信息,看不见堆栈。 

解决措施1首先应该检查用户使用的jdbc驱动是gsjdbc4.jar还是gsjdbc200.jar若是gsjdbc200.jar应该替换为gsjdbc4.jar尝试建立链接。2排除JDBC嫌疑,写一个Java测试用例,不通过应用程序架构,通过Java程序直接加载驱动,建立链接,在排除jdbc嫌疑之后再去细致研究应用程序框架以解决问题。

 

JDBC jar冲突

多个局点曾报出类冲突问题,都是由于JDBC和应用程序拥有相同路径相同名称的类导致,大体可以分为两类,一是gsjdbc4.jar和开源postgresql.jar冲突,两者具有完全相同的类名,二是gsjdbc4.jar 由于iam特性引入了一些其他工具,例如fastjson,和应用程序中的fastjson冲突

解决措施:针对和开源postgresql.jar冲突我们提供了gsjdbc200.jar使用开源驱动不同的url格式和驱动路径,驱动名org.postgresql.Driver修改为com.huawei.gauss200.jdbc.Driverurl格式由org:postgresql://host:port/database改为jdbc:gaussdb://host:port/database彻底解决了和开源jar的冲突针对JDBC引入的jar和应用程序中引入jar的冲突,我们通过mavenshade修改了jar里类的路径,解决了这类冲突

 

点击这里→了解更多精彩内容
 

相关推荐

数据库“意外失联”?华为云DRS异地多活灾备为您支招

数据管理服务DAS 之 数据库自动化运维功能展播4:慢SQL

云原生数据库三驾马车之TaurusDB

Entity Framework Core 捕获数据库变动

MongoDB经典故障系列一:数据库频繁启动失败怎么办?

展开阅读全文
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值