实战笔记丨JDBC问题定位指南
JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集。JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批组件之一。
JDBC问题基础知识
JDBC问题是指比较宽泛的,体现在JDBC层面的问题,造成JDBC问题的原因主要是三个方面:1、应用程序和应用程序框架问题;2、JDBC业务功能问题;3、数据库内核问题。问题表现可以分为三个大的方面:1、执行报错,JDBC抛出异常;2、执行效率低,耗时异常;3、特性不支持,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格式都是固定的,只允许配置ip、port、user、password等基本信息,并且在出错的时候只能看见建立链接失败的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.Driver,url格式由org:postgresql://host:port/database改为jdbc:gaussdb://host:port/database,彻底解决了和开源jar包的冲突;针对JDBC引入的jar和应用程序中引入jar的冲突,我们通过maven的shade修改了jar里类的路径,解决了这类冲突。
实战笔记丨JDBC问题定位指南的更多相关文章
- hibernate实战笔记1---初探
因为在学习Spring的时候学到有关数据库的章节的时候,提及到了hibernate的集成,可是我对hibernate技术差点儿是一点不了解.仅仅是知道它是一个orm对象映射框架,所以在初探的章节做一下 ...
- mysql颠覆实战笔记(五)--商品系统设计(二):定时更新商品总点击量
继续回到沈老师的MYSQL颠覆实战,首先回顾下上一节课的内容,请大家会看下上节课写的存储过程. 打开prod_clicklog表, 我们只要把日期(不含时分秒)的部分存在数据库中, 如果同一日期有相同 ...
- mysql颠覆实战笔记(四)--商品系统设计(一):商品主表设计
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- mysql颠覆实战笔记(一)--设计一个项目需求,灌入一万数据先
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- mysql颠覆实战笔记(七)--白话理解事务
今天我们学习web开发级mysql颠覆实战课程第9课没MYSQL事务(一):白话理解事务.前面有两节课第7讲:商品系统设计(四):商品属性设计之自定义属性,第8讲:商品系统设计(五):一维属性的商品价 ...
- mysql颠覆实战笔记(六)--商品系统设计(三):商品属性设计之固定属性
今天我们来讲一下商品属性 我们知道,不同类别的商品属性是不同的. 我们先建一个表prod_class_attr:
- mysql颠覆实战笔记(三)-- 用户登录(二):保存用户操作日志的方法
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- mysql颠覆实战笔记(二)-- 用户登录(一):唯一索引的妙用
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- Unity3D项目实战笔记(10):Unity3D编译IPA的PostEvents–节约时间利器
最近,SDK支付等接入差不多了,就从Unity3D生成IPA (企业版License), 然,需要手动执行的PostEvents竟然多大10项+, 这些我默默的承受了1周时间,每次约浪费20分钟-额外 ...
随机推荐
- Rocket - tilelink - RAMModel
https://mp.weixin.qq.com/s/9ccDTm6HytvfGN5R2CPoAQ 简单介绍RAMModel的实现. 1. 基本介绍 RAMModel用于定义内存 ...
- jchdl - GSL实例 - Mux4(使用WireVec简化输入线声明)
https://mp.weixin.qq.com/s/yJx_dV6ScUStJtPWVuD38w 原理图 参考链接 https://github.com/wjcdx/jchdl/blob/ma ...
- hdl - HLS vs. Generator
https://mp.weixin.qq.com/s/n_4RKlOddr_p2S_wODvFbw 介绍硬件建模的各个层次,以及基于RTL进一步提高层次的方法. 1. 物理版图 直接画 ...
- JavaSE(三) 变量与运算符
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 2 变量的使用 2.1按数据类型分类 整型 : byte(1字节 = 8bit) short(2字节 ...
- Java实现 LeetCode 690 员工的重要性(简易递归)
690. 员工的重要性 给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id. 比如,员工1是员工2的领导,员工2是员工3的领导.他们相应的重要度为15, 10, 5.那 ...
- uniapp每隔几秒执行一下网络请求(h5端亲测可以,其他端未测试)
methods: { //执行网络请求 run() { uni.request({ method: 'GET',//请求方式 url: ‘’//请求地址 }).then(res=>{ conso ...
- Fiddler13模拟弱网络环境测试
前言现在的Android软件,基本上都会有网络请求,有些APP需要频繁的传输数据时对于网络请求的稳定性和在特殊网络条件下的兼容性有要求,但是我们在测试的时候又很难模拟那种弱网络差网络的情况,今天就给大 ...
- Python如何绘制可视化图?给你一段代码,你能自己做出来吗
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 喜欢的朋友欢迎关注小编,除了分享技术文章之外还有很多福利 没有数据生成的图 ...
- Selenium上传文件方法大全
最好的方法:调js 其他方法: Python pywin32库,识别对话框句柄,进而操作 SendKeys库 autoIT,借助外力,我们去调用其生成的au3或exe文件. keybd_event,跟 ...
- StringBuilder(拼接字符串省内存)
观察如下代码: String s = ""; for (int i = 0; i < 1000; i++) { s = s + "," + i; } 虽然 ...