(本文档仅供参考)
技术原理
jsp页面中可以执行java代码,通过访问jsp页面,在页面中输入数据库连接信息和数据库语句,提交后jsp页面在服务端编译的class类会调用jdbc驱动的标准接口创建数据库连接,从而完成执行SQL、遍历结果集、关闭结果集、关闭连接等一系列操作,此过程中通过java代码做一些耗时计算,在代码执行完成后将耗时数据和查询结果展示在页面中,如果过程中遇到异常信息,也通过java代码将异常信息输出返回到页面中。 jsp页面中可以执行java代码,通过访问jsp页面,在页面中输入数据库连接信息和数据库语句,提交后jsp页面在服务端编译的class类会调用jdbc驱动的标准接口创建数据库连接,从而完成执行SQL/存储过程、遍历结果集、关闭结果集、关闭连接等一系列操作,此过程中通过java代码做一些耗时计算,在代码执行完成后将耗时数据和查询结果展示在页面中,如果过程中遇到异常信息,也通过java代码将异常信息输出返回到页面中。
为了避免争议,本文提供的jsp源代码不涉及smartbi相关的java类。
使用场景
1、数据源测试连接、打开报表报错
数据库报错往往会影响真实问题原因的分析,所以为了排查一些看似和smartbi相关但实际又是数据库jdbc驱动抛出的异常问题,可以通过java代码直接调用jdbc接口实现相关查询看是否正常,从而对比smartbi的逻辑是否有误;
2、创建数据库连接慢
打开smartbi报表加载慢,根据提供的CPU采样,定位是创建数据库连接慢,此时可以测试通过Java调用jdbc驱动执行SQL,对比通过加载当前驱动创建连接花费的时间;
3、等待数据库返回结果慢
...
3、数据库执行SQL/存储过程慢
打开smartbi报表加载慢,根据提供的CPU采样,定位是执行SQL/存储过程时数据库返回结果慢,但是将一样的SQL放到数据库工具中执行,返回结果并不需要很长时间,此时可以测试通过Java调用jdbc驱动执行SQL,对比通过加载当前驱动执行SQL所花费的时间;
4、遍历结果集慢
打开smartbi报表加载慢,根据提供的CPU采样,定位是数据库执行SQL后遍历结果集慢,但是将一样的SQL放到数据库工具中执行,查看一定行数的结果集并不需要很长时间,此时可以测试通过Java调用jdbc驱动执行SQL,对比通过加载当前驱动遍历结果集花费的时间;
5、查询数据不正确
打开smartbi报表查询的数据数据或总行数和直接在数据库工具中查询的结果不一致,此时也可以测试通过Java调用jdbc驱动执行SQL并勾选显示查询结果,对比通过加载当前驱动执行SQL查询的数据是否和smartbi报表展示的一致。
操作步骤
1、检查数据库驱动
检查驱动程序存放目录,如果是war自带的,则跳过此步骤,检查数据源驱动程序存放目录,如果是产品内置的(包含在smartbi.war中),则跳过此步骤。
其中v9以上版本确定驱动路径的查看方式:
如果是自定义添加的数据库动态驱动jar,需要找到jar的完整路径,注意如果是docker部署的,其jar路径不是通过linux ssh工具查看到的绝对路径,而是相对docker根路径的虚拟路径。
如下图是exe安装环境下添加的一个mysql动态驱动jar路径:下图是exe安装环境下添加的一个mysql动态驱动jar路径:
此时记下路径:D:\Smartbi\SmartbiInsight\Tomcat\bin\dynamicLibraryPath\mysql
如下图是docker环境下部署添加的一个动态驱动,需要加载的jar在图中的HADOOP下图是docker环境下部署添加的一个动态驱动,需要加载的jar在图中的HADOOP_HIVE目录:
此时需要记下路径:/tomcat/smartbiconfig/dynamicLibraryPath/HADOOP_HIVE
...
(若是测试存储过程查询,下载testjdbcPro.jsp,暂不支持Oracle等带出参的存储过程)
...
3、访问jsp页面执行数据库语句
执行SQL查询
浏览器访问 http://IP:PORT/smartbi/vision/testjdbcdata.jsp,在页面上填写待测试的数据库信息,其中查询SQL可选填,显示查询结果可选勾。
...
若为存储过程查询,浏览器访问地址修改为http://ip:port/smartbi/vision/testjdbcPro.jsp,其中“驱动类目录”填写规则同上,“查询存储过程”根据实际执行语句填写。
4、提交并查看测试结果
...
点击页面中的提交按钮,查看返回结果。
SQL查询
点击页面中的提交按钮,查看返回结果,如果查询SQL勾选了显示结果集,在数据库连接正常且查询不报错时,显示效果如下图:
...
此时,在服务器的smartbi.log最新内容中,也可以看到打印相关日志:
如果查询SQL不填内容就提交,则jsp页面只执行创建连接和关闭连接测试,测试结果只有创建连接耗时会显示时间,除了 如果查询SQL不填内容就提交,则jsp页面只执行创建连接和关闭连接测试,测试结果中会显示实际耗时的只有创建和关闭连接,除了查询SQL显示空字符串外,其他项一般显示未执行。
如果创建连接或者执行SQL报错,或者是驱动类目录填写有误,则错误信息后会显示一部分错误原因:
如果存储过程有返回多个结果集,查询结果会分别显示各个结果集的信息:
存储过程查询
如果存储过程有返回多个结果集,测试结果会分别显示各个结果集的信息:
5、后续处理方案
上述场景中,需要根据测试结果分析确定后续处理方案
...
观察测试结果中是否展示了红色的错误信息。如果在smartbi查询SQL报错,但是在数据库工具中查询没问题,若通过此方式仍会报错,则需排查驱动的问题。若通过此方式可正常查询,可将结果截图发回,再进一步跟踪此问题;
(2)创建数据库连接慢、等待数据库返回结果慢、遍历结果集慢 (2)创建数据库连接慢、数据库执行SQL/存储过程慢、遍历结果集慢
分别观察测试结果中输出的创建连接耗时、查询耗时、遍历结果集耗时展示的时间。如果在数据库工具中执行SQL快,但在smartbi中执行慢,若通过此种方式查询所需的时间并不长,可将截图发回,同时将smartbi中查询所需的时间及录制CPU一并反馈发回,以便进一步跟踪此问题;
(3)查询数据不正确观察查询结果中的表格,对比表格中的数据和smartbi报表中展示的原始数据集的数据及总行数是否一致。如果在数据库工具中查询的数据和表格中的不一致,需要确认是否连接的是同一个库、查询的是否是同一个shcema下的同名表,如果查询的目标对象都一致但是查询结果不一致,需要排查驱动的问题。
观察查询结果中的表格,对比表格中的数据和smartbi报表中展示的原始数据集的数据及总行数是否一致。如果在数据库工具中查询的数据和表格中的不一致,需要确认是否连接的是同一个库、查询的是否是同一个schema下的同名表,如果查询的目标对象都一致但是查询结果不一致,需要排查驱动的问题。
6、jsp页面报错
JSP页面进行查询测试,访问JSP页面报错如下:
处理方案如下:
1、将JSP页面中对应行的“override”删除,重新放入页面文件;
2、由于之前放入JSP页面已访问产生临时文件,需要先删除临时文件,可在exs-smartbi文件夹里搜索对应的jsp文件名。
路径:<Tomcat>/bin/exts-smartbi/smartbixxxxxxxwar/vision/