如何在 WebSphere 7 中捕获 Oracle JDBC PL/SQL 函数调用的参数值



我们通过Oracle JDBC驱动程序(11.2)(使用Spring JDBCTemplate*框架)进行PL/SQL函数调用,并且我们在WebSphere服务器的日志记录详细信息(运行时)中设置了com.ibm.ws.rsadapter.JDBC.*=all,但是CCD_ 1文件中捕获的数据不包含实际翻译的PL/SQL函数调用,也不包含传递给该函数的参数的值。

如何实现此日志记录详细信息?我们也在使用SLF4j库进行日志记录。

无论您为应用程序部署了什么日志框架,即Log4jjava.util.loggingSLF4j

  1. 获得一个相应的Oracle JDBC驱动程序,该驱动程序已在启用跟踪代码的情况下编译(以"_g.jar">结尾)。只要Oracle JDBC驱动程序的版本与底层数据库的版本匹配,最好获得最新的次版本(在我们的案例中,为11.2.0.4.0),因为它为每次调用输出附加信息。

    最新的诊断驱动程序将与Oracle数据库的旧版本兼容。您可以从Oracle的网站获取它们。

  2. 如果您使用WebSphere变量(即Oracle JDBC Driver)来指定Oracle JDBC驱动程序的位置,请将诊断JDBC

  3. 确保启动服务器的WebSphere用户具有访问驱动程序的适当文件系统权限,即ojdbc6-g.jar.

  4. WebSphere管理控制台中,更改JDBC提供程序以指向新的驱动程序:

    • 扩展资源
    • 扩展JDBC
    • 选择JDBC提供程序
    • 选择">Oracle JDBC Driver"(或服务器上命名的任何Java数据库连接提供程序)
    • 将">类路径"从">${ORACLE_JDBC_DRIVER_path}/ojdbc6.jar
    • 单击"应用">
  5. 设置跟踪日志记录级别:

    • 扩展服务器
    • 展开服务器类型
    • 单击WebSphere应用程序服务器
    • 选择目标服务器
    • 向下滚动至">故障排除"小节
    • 选择"更改日志详细级别">
    • 切换到运行时选项卡
    • 将组件从">*=info"更改为">*=info:oracle.jdbc.*=all"(无双引号)
    • 单击"应用">
    • 请注意,日志记录级别可以在运行时更改,即您可以提供">fine"、">fine或">2finell"。这里列出了每个日志记录级别所需的内容
  6. 找到服务器日志记录文件夹:

    • 重复5a到5e
    • 选择">日志记录和跟踪">
    • 选择"诊断跟踪">
    • 在"常规属性/跟踪输出"部分下,文件名应提供跟踪文件的名称(默认值为${SERVER_LOG_ROOT}/Trace.LOG)。请注意,根据大小或日期,跟踪日志文件可能处于滚动/旋转模式
  7. 重新启动WebSphere服务器

  8. 执行调用PL/SQL函数调用的代码

  9. WebSphere现在应该捕获trace.log文件中JDBC调用的所有细节,即使用parameter 1parameter 2parameter 3这三个参数和值调用schema_user.plsql_package.procedure(),这将导致({call ...}是我从Springtrace.log0调用存储过程的方式,但您可以看到,在底层,Oracle驱动程序如何将其转换为PL/SQL匿名块调用):

...
[1/20/15 10:22:14:431 EDT] 00000020 driver        Z   263D263D Enter: 1, "parameter 1", 2
[1/20/15 10:22:14:431 EDT] 00000020 driver        1   263D263D Public Enter: 1, "parameter 1"
[1/20/15 10:22:14:431 EDT] 00000020 driver        2   263D263D Enter: 1, "parameter 1", 2
[1/20/15 10:22:14:431 EDT] 00000020 driver        2   263D263D Enter: 1, "parameter 1", 2, 0
[1/20/15 10:22:14:431 EDT] 00000020 driver        2   263D263D Enter: 1, "parameter 1", 2, 0
[1/20/15 10:22:14:431 EDT] 00000020 driver        2   263D263D Enter: 1, oracle.sql.NUMBER@42764276
[1/20/15 10:22:14:431 EDT] 00000020 driver        <   263D263D Exit [0.0409ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        <   263D263D Exit [0.1926ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        <   263D263D Exit [0.2515ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        <   263D263D Exit [0.3107ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        1   263D263D Exit [0.4817ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        Z   263D263D Exit [0.5556ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        Z   263D263D Enter: 2, "parameter 2"
[1/20/15 10:22:14:431 EDT] 00000020 driver        1   263D263D Public Enter: 2, "parameter 2"
[1/20/15 10:22:14:431 EDT] 00000020 driver        2   263D263D Enter: 2, "parameter 2"
[1/20/15 10:22:14:431 EDT] 00000020 driver        2   263D263D Enter: 2, "parameter 2"
[1/20/15 10:22:14:431 EDT] 00000020 driver        <   263D263D Exit [0.0049ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        <   263D263D Exit [0.0691ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        1   263D263D Exit [0.1276ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        Z   263D263D Exit [0.2008ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        Z   263D263D Enter: 3, "parameter 3"
[1/20/15 10:22:14:431 EDT] 00000020 driver        1   263D263D Public Enter: 3, "parameter 3"
[1/20/15 10:22:14:431 EDT] 00000020 driver        2   263D263D Enter: 3, "parameter 3"
[1/20/15 10:22:14:431 EDT] 00000020 driver        2   263D263D Enter: 3, "parameter 3"
[1/20/15 10:22:14:431 EDT] 00000020 driver        <   263D263D Exit [0.0036ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        <   263D263D Exit [0.0549ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        1   263D263D Exit [0.1094ms]
[1/20/15 10:22:14:431 EDT] 00000020 driver        Z   263D263D Exit [0.161ms]
...
[1/20/15 10:22:14:433 EDT] 00000020 driver        2   32B732B7 Enter: "
{call schema_user.plsql_package.procedure(
param_1 => :param_1,
param_2 => :param_2,
param_3 => :param_3)}"
...
[1/20/15 10:22:14:434 EDT] 00000020 driver        2   32B732B7 Return: 
BEGIN schema_user.plsql_package.procedure(
param_1 => :param_1,
param_2 => :param_2,
param_3 => :param_3); END;
...

Oracle JDBC驱动程序确实对应用程序进行的存储过程调用执行缓存。因此,在第一次调用之后,日志文件并没有像第一次尝试时那样捕获所有需要的信息——捕获的信息的范围不会像第一次调用那样全面。此外,跟踪日志记录足够详细,可能会使解析感兴趣的部分变得笨拙。

因此,为了在第一次调用后清除驱动程序缓存的存储过程调用,请按照以下说明进行操作:

  1. 登录WebSphere管理控制台(集成解决方案控制台)

  2. 导航到资源->JDBC>数据源

  3. 如果有任何不同的,请检查处理过程调用的适当数据源框

  4. 单击网格表顶部的">管理状态…"按钮

  5. 在">JCA生命周期管理"页面上,选中相同资源

  6. 点击">清除"按钮

此外,如果您在Windows环境中运行/测试WebSphere,则可以使用SnakeTail工具对tail(类似于Unix/Linux系统)trace.log文件(速度快,响应快,缓冲区大)进行测试。

最新更新