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

How to Capture Oracle JDBC PL/SQL Function Call's Parameter Values in WebSphere 7

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

我怎样才能获得这个日志记录细节?我们也使用 SLF4j 库进行日志记录。

无论您为应用程序部署了何种日志记录框架,以下解决方案都有效,即 Log4jjava.util.loggingSLF4j, 等等:

  1. 获取对应的Oracle JDBC已编译并启用跟踪代码的驱动程序(以“_g.jar")。只要 Oracle JDBC 驱动程序的 主要 版本与基础数据库的相匹配,最好获取 最新的次要版本 (在我们的例子中, 11.2.0.4.0),因为它会为每次调用输出附加信息。

    最新的诊断驱动程序将与旧版本的 Oracle 数据库兼容。您可以从 Oracle's website here.

  2. 获取它们
  3. 如果您使用了WebSphere变量(即Oracle JDBC Driver)来指定Oracle的位置JDBC 驱动程序,将诊断 JDBC 驱动程序放在与常规驱动程序相同的文件夹中(以便于跟踪)。尽管如此,您可以将它放在文件系统的任何位置。

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

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

    • 展开资源
    • 展开JDBC
    • Select JDBC 提供商
    • Select “Oracle JDBC 驱动程序”(或服务器上指定的任何 Java 数据库连接提供程序)
    • 从“${ORACLE_JDBC_DRIVER_PATH}/ojdbc6.jar[=161=”更改“Class路径” ]”到“${ORACLE_JDBC_DRIVER_PATH}/ojdbc6_g.jar
    • 单击应用
  6. 要设置跟踪日志记录级别:

    • 展开服务器
    • 展开服务器类型
    • 单击 WebSphere 应用程序服务器
    • Select目标服务器
    • 向下滚动到“疑难解答”子部分
    • Select "更改日志详细信息级别"
    • 切换到运行时选项卡
    • 将组件从“*=info”更改为“*=info: oracle.jdbc.*=all” (没有双引号)
    • 单击应用
    • 请注意,日志记录级别可以在运行时更改,即您可以提供“fine”,而不是“all”,“ 更好”,或“最好”。每个列表什么logging level entails to is here.
  7. 找到服务器日志记录文件夹:

    • 重复 5a 到 5e
    • Select "记录和跟踪"
    • Select "诊断跟踪"
    • 在“General Properties/Trace Output”部分,File Name 应提供跟踪文件的名称(默认为 ${SERVER_LOG_ROOT}/trace.log)。请注意,跟踪日志文件可能处于 rolling/rotating 模式,具体取决于大小或日期
  8. 重新启动 WebSphere 服务器

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

  10. WebSphere 现在应该在 trace.log 文件中捕获所有细节 JDBC 调用,即使用 parameter 1parameter 2parameter 3 的三个参数和值调用 schema_user.plsql_package.procedure(),将导致({call ...} 是我调用存储过程的方式来自 SpringJdbcTemplate*,但您可以看到在低级别,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. 单击网格顶部的“管理状态...”按钮 table

  5. 在“JCA生命周期管理”页面,勾选相同的资源

  6. 单击“清除”按钮

此外,如果您 running/testing 您的 WebSphereWindows 环境中,您可以使用 SnakeTail 工具到 tail(如 Unix/Linux 系统)trace.log 文件(相当快且响应速度快,缓冲区大)。