【華爲雲技術分享】實戰筆記丨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經典故障系列一:數據庫頻繁啓動失敗怎麼辦?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章