【问题标题】:How to Capture Oracle JDBC PL/SQL Function Call's Parameter Values in WebSphere 7如何在 WebSphere 7 中捕获 Oracle JDBC PL/SQL 函数调用的参数值
【发布时间】:2015-03-26 18:08:41
【问题描述】:

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

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

【问题讨论】:

    标签: java oracle logging jdbc websphere


    【解决方案1】:

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

    1. 获取已在启用跟踪代码的情况下编译的相应 Oracle JDBC 驱动程序(以“_g.jar”结尾)。只要 Oracle JDBC 驱动程序的 主要 版本与底层数据库匹配,最好在输出时获取 最新的次要版本(在我们的例子中为 11.2.0.4.0)每次通话的附加信息。

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

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

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

    4. WebSphere Admin Console 中,更改 JDBC 提供程序以指向新的驱动程序:

      • 展开资源
      • 展开JDBC
      • 选择 JDBC 提供程序
      • 选择“Oracle JDBC 驱动程序”(或服务器上已命名的任何 Java 数据库连接提供程序)
      • 将“类路径”从“${ORACLE_JDBC_DRIVER_PATH}/ojdbc6.jar”更改为“${ORACLE_JDBC_DRIVER_PATH}/ojdbc6_g.jar >"
      • 点击应用
    5. 设置跟踪日志级别:

      • 展开服务器
      • 展开服务器类型
      • 点击WebSphere应用服务器
      • 选择目标服务器
      • 向下滚动到“疑难解答”子部分
      • 选择“更改日志详细级别
      • 切换到运行时标签
      • 将组件从“*=info”更改为“*=info: oracle.jdbc.*=all”(不带双引号)
      • 点击应用
      • 请注意,日志记录级别可以在运行时更改,即您可以提供“fine”、“finer”而不是“all” ”或“最佳”。每个logging level entails to is here的列表。
    6. 找到服务器日志文件夹:

      • 重复 5a 到 5e
      • 选择“记录和跟踪
      • 选择“诊断跟踪
      • 在“General Properties/Trace Output”部分下,File Name 应提供跟踪文件的名称(默认为 ${SERVER_LOG_ROOT}/trace.log) .请注意,跟踪日志文件可能会根据大小或日期处于滚动/旋转模式
    7. 重启 WebSphere 服务器

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

    9. WebSphere 现在应该在trace.log 文件中捕获所有详细JDBC 调用,即使用三个参数和值parameter 1 调用schema_user.plsql_package.procedure()parameter 2parameter 3 将导致({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 Admin Console(集成解决方案控制台)

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

    3. 选中处理过程调用的适当数据源框(如果有任何不同)

    4. 点击网格表顶部的“管理状态...”按钮

    5. 在“JCA 生命周期管理”页面上,选中同一资源

    6. 点击“清除”按钮

    另外,如果您在 Windows 环境中运行/测试您的 WebSphere,您可以使用 SnakeTail 工具到 tail(如 Unix/ Linux 系统)trace.log 文件(非常快且响应速度快,缓冲区大小较大)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多