一、关系数据源连接基本原理
Smartbi的主服务、OLAP、ETL通过JDBC驱动给数据库服务器发送SQL或者JDBC指令,数据库服务器接收请求后分配资源执行作业并在作业结束后将结果回传给驱动,最后BI调用驱动接口获取结果,执行BI的业务逻辑。整个访问链路的核心是JDBC驱动,它是BI和数据库服务器沟通的桥梁。
二、JDBC驱动介绍
JDBC驱动是Java应用与数据库之间的「翻译器」,负责将Java代码中的SQL请求转换为数据库能理解的语言,并把结果返回给Java程序。BI、OLAP、ETL都是Java应用,对数据库的操作依赖于JDBC驱动。市面上有各种各样的数据库,它们提供的JDBC驱动不尽相同。以获取数据库连接为例,如果每种驱动获取连接的接口都是独特,那BI需要针对不同数据库实现不同的代码逻辑,这将是灾难性的。幸运的是,Java社区很早就考虑到了。Java社区发布了一套JDBC规范,各数据库厂商按照JDBC规范实现各自的驱动,Java应用只需要按照JDBC规范调用驱动接口,只需要一套代码,即可与不同数据库无缝交互。由此可见,BI能否对应某个新型数据库,取决于该数据库能否提供标准的JDBC驱动。JDBC驱动是Java应用与数据库之间的「翻译器」,负责将Java代码中的SQL请求转换为数据库能理解的语言,并把结果返回给Java程序。BI、OLAP、ETL都是Java应用,对数据库的操作依赖于JDBC驱动。市面上有各种各样的数据库,它们提供的JDBC驱动不尽相同。以获取数据库连接为例,如果每种驱动获取连接的接口都是独特,那BI需要针对不同数据库实现不同的代码逻辑,这将是灾难性的。幸运的是,Java社区很早就考虑到了。Java社区发布了一套JDBC规范,各数据库厂商按照JDBC规范实现各自的驱动,Java应用只需要按照JDBC规范调用驱动接口,只需要一套代码,即可与不同数据库1232px无缝交互。由此可见,BI能否对应某个新型数据库,取决于该数据库能否提供标准的JDBC驱动。
2.1JDBC驱动关键概念
- 驱动类
...
下图介绍了创建数据库连接的过程,开始阶段可以看作在数据源界面点击测试连接,看看BI是怎么一步步进行的。
1)加载驱动
数据源配置界面有两个与加载驱动过程密切相关的配置:驱动路径(产品内置、自定义)和驱动类。加载驱动的过程其实就是从驱动路径上找到驱动类,为后续创建连接做准备。
...
以连接行云数据库为例,测试连接抛出异常“连接池初始化失败: 数据库驱动找不到com.bonc.xcloud.jdbc.XCloudDriver”,报错信息说找不到驱动了。首先我们确认驱动类配置得对不对,发现配置的驱动类“com.bonc.xcloud.jdbc.XCloudDriver”是正确的。那接下来确认驱动目录下有没有这个类,可以使用BI的类查找功能。
注意到数据源配置了自定义驱动目录,产品将会在sybase目录加载行云的驱动类。在系统监控/类查找中发现对应的驱动类不存在,那我们考虑驱动目录选错了,或者放入的jar不全。
调整驱动目录后,测试连接正常了,并且附上类查找效果图。
2)驱动包不全或者有jar包冲突问题
...
比如mysql驱动_JDBC_mysql-connector-java-5.1.48在JDK9及以上版本时,需要加连接参数useSSL=false,否则会连不上。
如上图,mysql测试连接失败,我们从栈信息中提取到这样的报错,从报错关键字ssl可以知道跟加密连接有关,结合网上查询到的线索,可以配置useSSL=false规避。
...
这个步骤其实很关键,可以过滤很多非BI因素的问题。如果有其他JDBC工具(如)可以成功连上,那可以确认驱动类、驱动包、连接字符串、账号密码是否有差异。如果有差异,保证数据源的所有配置信息都与第三方工具保持一致。如果其他JDBC工具也无法正常连接,那得考虑数据库和网络等第三方原因。
步骤2:查看报错信息与日志。
参考【如何处理功能报错类异常】,获取详细的报错堆栈日志或者导出Smartbi系统日志,一般是找到报错堆栈最后一个Caused by:后的内容,通常为问题根源。
下图的报错信息可看的内容不多,为了进一步确定问题,可以拿一下完整的栈信息,我们定位到最后哦一个Caused by,才发现问题所在。
步骤3:基于报错关键字进行分析。
阅读Caused by:后的错误内容,看是否能够对应到上述说的哪一类问题,并进行解决。若无法自行定位,可使用AI辅助进行诊断,将错误描述或代码输入AI工具,尝试AI定位的问题类型和解决方案进行解决。也可将错误代码复制至WIKI等企业内部资源进行检索。注意:每个数据库的报错可能不同,例如,MySQL、Oracle、SQL Server在相同问题下可能会有不同的报错信息,这里不一一进行说明。以useSSL=false的实例,参考AI的回答,在第一个回答中已经提示禁用useSSL=false。
步骤4:通过第三方工具测试。
...
常见的网络测试命令有ping、telnet。ping命令测试主机间的网络连通性,测不了端口。telnet命令测端口连通性,但很多Window或Linux默认没有启用或安装。这里介绍另外一种SSH测试的方法,Windows和Linux环境一般都有默认安装。更多测试方法参考FAQ文档:如何检测系统间的网络通讯是否正常 - FAQ中心 -
SSH命令格式:ssh IP地址 -p 端口号 -v
比如我们测试wiki服务器的地址:ssh 比如我们测试wiki服务器的地址:ssh wiki.smartbi.com.cn -p 8443 -v,如果成功,则有 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等各组件服务器上运行;支持模拟多线程并发查询; 不足:界面展示没那么直观 |
...
通过前期的排查仍然定位不到问题的,可以提JIRA寻求技术支持的帮助。JIRA中需要包含BI版本信息、报错详细日志、前期排查的一些结果等,避免反馈信息量少的截图。如果客户无法发回日志文件,至少把报错弹窗的完整栈信息拍照发回。如:下图,最开始只是弹窗提示说“连接池初始化失败”,如果将其作为日志反馈,是一个无效的日志。点击【显示栈信息】之后,找到最后一个Caused by文本位置,才能发现有用的信息。