...
大部分数据源连不上问题都发生在加载驱动和创建连接两个阶段,接下来说明两个阶段会有哪些典型问题。
3.1加载驱动
加载驱动阶段包含以下主要问题:
...
1)驱动目录下不存在驱动类
以连接行云数据库为例,测试连接抛出异常“连接池初始化失败: 数据库驱动找不到com.bonc.xcloud.jdbc.XCloudDriver”,报错信息说找不到驱动了。首先我们确认驱动类配置得对不对,发现配置的驱动类“com.bonc.xcloud.jdbc.XCloudDriver”是正确的。那接下来确认驱动目录下有没有这个类,可以使用BI的类查找功能。
注意到数据源配置了自定义驱动目录,产品将会在sybase目录加载行云的驱动类。在系统监控/类查找中发现对应的驱动类不存在,那我们考虑驱动目录选错了,或者放入的jar不全。
调整驱动目录后,测试连接正常了,并且附上类查找效果图。
...
2)驱动包不全或者有jar包冲突问题
常见于一些大数据相关库,它们的驱动包通常不止一个,少一个或者多一个jar都有可能导致程序无法正常加载驱动。驱动包不全容易理解,就是缺少了某个jar,将jar包补上即可。jar包冲突比较复杂,有可能驱动目录下有两个不同版本的jar,也有可能驱动的类包与产品自带的类包冲突了。通常的报错有ClassNotFoundException或者NoClassDefineFound。这种报错解决方法不好归纳,需要根据系统日志综合判断。
3.2创建连接
创建连接阶段包含以下主要问题:
...
1)连接字符串不合规范,或者无法匹配当前驱动版本和数据库版本
比如mysql驱动_JDBC_mysql-connector-java-5.1.48在JDK9及以上版本时,需要加连接参数useSSL=false,否则会连不上。
如上图,mysql测试连接失败,我们从栈信息中提取到这样的报错,从报错关键字ssl可以知道跟加密连接有关,结合网上查询到的线索,可以配置useSSL=false规避。
代码块 | ||||
---|---|---|---|---|
| ||||
Caused by: javax.net.ssl.SSLException: Received fatal alert: internal_error
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) ~[?:1.8.0_202]
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) ~[?:1.8.0_202]
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2020) ~[?:1.8.0_202]
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1127) ~[?:1.8.0_202]
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367) ~[?:1.8.0_202]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395) ~[?:1.8.0_202]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379) ~[?:1.8.0_202]
at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:186) ~[_JDBC_mysql-connector-java-5.1.48.jar:5.1.48] |
...
2)网络问题
网络不可达或者网络拦截导致BI到数据库服务器的网络不通,下面罗列一些常见的网络原因报错。网络问题可以通过telnet、ssh等工具测试网络是否通畅,但从排查角度上来说,很多网络问题都需要跟客户网络运维一起排查。
报错关键字 | 网络错误分类 | 可能原因 |
java.net.ConnectException: Connection refused | 连接超时类错误 |
|
java.net.SocketTimeoutException: Connect timed out | 连接超时类错误 |
|
java.net.UnknownHostException | DNS 解析失败 |
|
java.net.SocketException: Connection reset | 连接中断或丢失 |
|
java.net.SocketException: Broken pipe | 连接中断或丢失 |
|
...
3)数据库服务器认证失败或者鉴权失败
常见的一些错误信息:
数据库类型 | 错误信息 | 核心原因 | 解决方案 |
MySQL |
| 用户名或密码错误(区分大小写) | 1. 检查用户名、密码是否正确 |
MySQL |
| 连接时未提供密码,但数据库要求认证 | 在连接字符串或参数中提供正确的密码 |
MySQL |
| 用户无目标数据库的访问权限 | 执行 |
MySQL |
| 用户的 | 修改用户权限: |
PostgreSQL |
| 密码错误或驱动不兼容认证方式(如旧驱动不支持 | 1. 检查密码正确性 |
PostgreSQL |
| 用户角色未在数据库中创建 | 执行 |
PostgreSQL |
| 用户无 | 执行 |
Oracle |
| 用户名或密码错误(区分大小写) | 1. 确保用户名和密码大小写正确(Oracle默认大写) |
Oracle |
| 用户无目标操作权限(如 | 执行 |
SQL Server |
| 用户名/密码错误或未启用混合认证模式 | 1. 检查密码 |
SQL Server |
| 用户未被映射到目标数据库 | 执行 |
四、定位排查问题
通过以上说明,我们对于基本原理和常见的错误类型已经有了基本的概念,接下来我们可以通过以下步骤,定位数据库连接失败的根本原因,并针对性进行解决。
...
步骤1:确认其他JDBC工具有没有成功连上的先例。这个步骤其实很关键,可以过滤很多非BI因素的问题。如果有其他JDBC工具(如)可以成功连上,那可以确认驱动类、驱动包、连接字符串、账号密码是否有差异。如果有差异,保证数据源的所有配置信息都与第三方工具保持一致。如果其他JDBC工具也无法正常连接,那得考虑数据库和网络等第三方原因。
...
步骤1:确认其他JDBC工具有没有成功连上的先例。
这个步骤其实很关键,可以过滤很多非BI因素的问题。如果有其他JDBC工具(如)可以成功连上,那可以确认驱动类、驱动包、连接字符串、账号密码是否有差异。如果有差异,保证数据源的所有配置信息都与第三方工具保持一致。如果其他JDBC工具也无法正常连接,那得考虑数据库和网络等第三方原因。
步骤2:查看报错信息与日志。
参考【如何处理功能报错类异常】,获取详细的报错堆栈日志或者导出Smartbi系统日志,一般是找到报错堆栈最后一个Caused by:后的内容,通常为问题根源。
下图的报错信息可看的内容不多,为了进一步确定问题,可以拿一下完整的栈信息,我们定位到最后哦一个Caused by,才发现问题所在。
步骤3:基于报错关键字进行分析。阅读Caused by:后的错误内容,看是否能够对应到上述说的哪一类问题,并进行解决。若无法自行定位,可使用AI辅助进行诊断,将错误描述或代码输入AI工具,尝试AI定位的问题类型和解决方案进行解决。也可将错误代码复制至WIKI等企业内部资源进行检索。注意:每个数据库的报错可能不同,例如,MySQL、Oracle、SQL
阅读Caused by:后的错误内容,看是否能够对应到上述说的哪一类问题,并进行解决。若无法自行定位,可使用AI辅助进行诊断,将错误描述或代码输入AI工具,尝试AI定位的问题类型和解决方案进行解决。也可将错误代码复制至WIKI等企业内部资源进行检索。注意:每个数据库的报错可能不同,例如,MySQL、Oracle、SQL Server在相同问题下可能会有不同的报错信息,这里不一一进行说明。以useSSL=false的实例,参考AI的回答,在第一个回答中已经提示禁用useSSL=false。
步骤4:通过第三方工具测试。
很多情况下网络或者数据库的特殊配置会导致数据源连不上,这时候需要客户的网络运维或者DBA参与解决,往往需要我们给出佐证,这时候可以在BI服务器上通过第三方工具进行测试,如果问题原因不在BI端,需要客户协调数据库或者网络运维资源,我们从旁协助。
...
1)网络测试工具
常见的网络测试命令有ping、telnet。ping命令测试主机间的网络连通性,测不了端口。telnet命令测端口连通性,但很多Window或Linux默认没有启用或安装。这里介绍另外一种SSH测试的方法,Windows和Linux环境一般都有默认安装。更多测试方法参考FAQ文档:如何检测系统间的网络通讯是否正常 - FAQ中心 -
SSH命令格式:ssh IP地址 -p 端口号 -v
比如我们测试wiki服务器的地址:ssh wiki.smartbi.com.cn -p 8443 -v,如果成功,则有 Connection established相关提示,如果失败则有Connection refused相关提示。
成功的示例:
网络不通的示例:
不会提示 Connection established,首先是长时间的连接过程,输出Connecting to xxx的日志
最后会输出连接超时的报错。
...
2)JDBC查询工具
JDBC查询工具是基于JDBC逻辑的,抛开具体的BI逻辑,可进行测试连接、对比执行结果、耗时长短等。常用测试工具有:DBeaver工具、jsp测试工具、jar测试工具
工具 | 说明 | 特点/不足 |
Dbeaver | DBeaver 是一款免费、开源的通用数据库管理工具,支持几乎所有主流数据库 | 特点:脱离BI应用验证; 不足:服务器上一般没有预装Dbeaver,无法直接验证 |
JSP测试工具 | 一些JSP测试页面,可以测试JDBC查询、获取表信息等操作 | 特点:代码可见,基于驱动逻辑,代码即改即生效; 不足:需要依赖BI,不能在OLAP或者ETL等组件服务器上单独测试 |
Jar测试工具 | 通过java代码写的java类或者jar包测试工具 | 特点:代码可见,即时编译执行,只要有jdk,就可以在BI、OLAP、ETL等各组件服务器上运行;支持模拟多线程并发查询; 不足:界面展示没那么直观 |
步骤5:提JIRA寻求帮助。
通过前期的排查仍然定位不到问题的,可以提JIRA寻求技术支持的帮助。JIRA中需要包含BI版本信息、报错详细日志、前期排查的一些结果等,避免反馈信息量少的截图。如果客户无法发回日志文件,至少把报错弹窗的完整栈信息拍照发回。如:下图,最开始只是弹窗提示说“连接池初始化失败”,如果将其作为日志反馈,是一个无效的日志。点击【显示栈信息】之后,找到最后一个Caused by文本位置,才能发现有用的信息。