如何在 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 库进行日志记录。
无论您为应用程序部署了何种日志记录框架,以下解决方案都有效,即 Log4j、java.util.logging
、SLF4j, 等等:
获取对应的Oracle JDBC已编译并启用跟踪代码的驱动程序(以“_g.jar")。只要 Oracle JDBC 驱动程序的 主要 版本与基础数据库的相匹配,最好获取 最新的次要版本 (在我们的例子中, 11.2.0.4.0),因为它会为每次调用输出附加信息。
最新的诊断驱动程序将与旧版本的 Oracle 数据库兼容。您可以从 Oracle's website here.
获取它们
如果您使用了WebSphere变量(即Oracle JDBC Driver
)来指定Oracle的位置JDBC 驱动程序,将诊断 JDBC 驱动程序放在与常规驱动程序相同的文件夹中(以便于跟踪)。尽管如此,您可以将它放在文件系统的任何位置。
确保启动服务器的 WebSphere 用户具有访问驱动程序的适当文件系统权限,即 ojdbc6_g.jar.
从 WebSphere 管理控制台,更改 JDBC 提供程序以指向新驱动程序:
- 展开资源
- 展开JDBC
- Select JDBC 提供商
- Select “Oracle JDBC 驱动程序”(或服务器上指定的任何 Java 数据库连接提供程序)
- 从“${ORACLE_JDBC_DRIVER_PATH}/ojdbc6.jar[=161=”更改“Class路径” ]”到“${ORACLE_JDBC_DRIVER_PATH}/ojdbc6_g.jar”
- 单击应用
要设置跟踪日志记录级别:
- 展开服务器
- 展开服务器类型
- 单击 WebSphere 应用程序服务器
- Select目标服务器
- 向下滚动到“疑难解答”子部分
- Select "更改日志详细信息级别"
- 切换到运行时选项卡
- 将组件从“*=info”更改为“*=info: oracle.jdbc.*=all” (没有双引号)
- 单击应用
- 请注意,日志记录级别可以在运行时更改,即您可以提供“fine”,而不是“all”,“ 更好”,或“最好”。每个列表什么logging level entails to is here.
找到服务器日志记录文件夹:
- 重复 5a 到 5e
- Select "记录和跟踪"
- Select "诊断跟踪"
- 在“General Properties/Trace Output”部分,File Name 应提供跟踪文件的名称(默认为 ${SERVER_LOG_ROOT}/trace.log)。请注意,跟踪日志文件可能处于 rolling/rotating 模式,具体取决于大小或日期
重新启动 WebSphere 服务器
执行调用 PL/SQL 函数调用的代码
WebSphere 现在应该在 trace.log
文件中捕获所有细节 JDBC 调用,即使用 parameter 1
、parameter 2
和 parameter 3
的三个参数和值调用 schema_user.plsql_package.procedure()
,将导致({call ...}
是我调用存储过程的方式来自 Spring 的 JdbcTemplate*
,但您可以看到在低级别,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 驱动程序确实对应用程序调用的存储过程执行缓存。因此,在第一次调用之后,日志文件不会像第一次尝试那样捕获所有需要的信息——捕获信息的范围不会像第一次调用那样全面。此外,跟踪记录足够详细,可以使解析感兴趣的部分变得笨拙。
因此,为了在第一次调用后清除驱动程序缓存的存储过程调用,请按照以下说明操作:
登录 WebSphere 管理控制台(集成解决方案控制台)
导航至资源 -> JDBC -> 数据源
检查处理过程调用的适当数据源框,如果有任何不同的话
单击网格顶部的“管理状态...”按钮 table
在“JCA生命周期管理”页面,勾选相同的资源
单击“清除”按钮
此外,如果您 running/testing 您的 WebSphere 在 Windows 环境中,您可以使用 SnakeTail 工具到 tail
(如 Unix/Linux 系统)trace.log
文件(相当快且响应速度快,缓冲区大)。
我们正在通过 Oracle JDBC 驱动程序 (11.2) 放置 PL/SQL 函数调用(使用 Spring JDBCTemplate* 框架),并且我们已经设置 com.ibm.ws.rsadapter.jdbc.*=all 在 WebSphere 服务器的日志记录详细信息(运行时)中,但 trace.log
文件中捕获的数据不包含实际翻译的 PL/SQL 函数调用也不是传递给函数的参数值。
我怎样才能获得这个日志记录细节?我们也使用 SLF4j 库进行日志记录。
无论您为应用程序部署了何种日志记录框架,以下解决方案都有效,即 Log4j、java.util.logging
、SLF4j, 等等:
获取对应的Oracle JDBC已编译并启用跟踪代码的驱动程序(以“_g.jar")。只要 Oracle JDBC 驱动程序的 主要 版本与基础数据库的相匹配,最好获取 最新的次要版本 (在我们的例子中, 11.2.0.4.0),因为它会为每次调用输出附加信息。
最新的诊断驱动程序将与旧版本的 Oracle 数据库兼容。您可以从 Oracle's website here.
获取它们
如果您使用了WebSphere变量(即
Oracle JDBC Driver
)来指定Oracle的位置JDBC 驱动程序,将诊断 JDBC 驱动程序放在与常规驱动程序相同的文件夹中(以便于跟踪)。尽管如此,您可以将它放在文件系统的任何位置。确保启动服务器的 WebSphere 用户具有访问驱动程序的适当文件系统权限,即 ojdbc6_g.jar.
从 WebSphere 管理控制台,更改 JDBC 提供程序以指向新驱动程序:
- 展开资源
- 展开JDBC
- Select JDBC 提供商
- Select “Oracle JDBC 驱动程序”(或服务器上指定的任何 Java 数据库连接提供程序)
- 从“${ORACLE_JDBC_DRIVER_PATH}/ojdbc6.jar[=161=”更改“Class路径” ]”到“${ORACLE_JDBC_DRIVER_PATH}/ojdbc6_g.jar”
- 单击应用
要设置跟踪日志记录级别:
- 展开服务器
- 展开服务器类型
- 单击 WebSphere 应用程序服务器
- Select目标服务器
- 向下滚动到“疑难解答”子部分
- Select "更改日志详细信息级别"
- 切换到运行时选项卡
- 将组件从“*=info”更改为“*=info: oracle.jdbc.*=all” (没有双引号)
- 单击应用
- 请注意,日志记录级别可以在运行时更改,即您可以提供“fine”,而不是“all”,“ 更好”,或“最好”。每个列表什么logging level entails to is here.
找到服务器日志记录文件夹:
- 重复 5a 到 5e
- Select "记录和跟踪"
- Select "诊断跟踪"
- 在“General Properties/Trace Output”部分,File Name 应提供跟踪文件的名称(默认为 ${SERVER_LOG_ROOT}/trace.log)。请注意,跟踪日志文件可能处于 rolling/rotating 模式,具体取决于大小或日期
重新启动 WebSphere 服务器
执行调用 PL/SQL 函数调用的代码
WebSphere 现在应该在
trace.log
文件中捕获所有细节 JDBC 调用,即使用parameter 1
、parameter 2
和parameter 3
的三个参数和值调用schema_user.plsql_package.procedure()
,将导致({call ...}
是我调用存储过程的方式来自 Spring 的JdbcTemplate*
,但您可以看到在低级别,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 驱动程序确实对应用程序调用的存储过程执行缓存。因此,在第一次调用之后,日志文件不会像第一次尝试那样捕获所有需要的信息——捕获信息的范围不会像第一次调用那样全面。此外,跟踪记录足够详细,可以使解析感兴趣的部分变得笨拙。
因此,为了在第一次调用后清除驱动程序缓存的存储过程调用,请按照以下说明操作:
登录 WebSphere 管理控制台(集成解决方案控制台)
导航至资源 -> JDBC -> 数据源
检查处理过程调用的适当数据源框,如果有任何不同的话
单击网格顶部的“管理状态...”按钮 table
在“JCA生命周期管理”页面,勾选相同的资源
单击“清除”按钮
此外,如果您 running/testing 您的 WebSphere 在 Windows 环境中,您可以使用 SnakeTail 工具到 tail
(如 Unix/Linux 系统)trace.log
文件(相当快且响应速度快,缓冲区大)。