gpt4 book ai didi

java - 如何以合理的方式使用 Oracle 驱动程序的日志记录来记录 UPDATE 语句?

转载 作者:行者123 更新时间:2023-12-04 13:50:56 25 4
gpt4 key购买 nike

我想记录我的应用程序发出的所有 SQL,所以我确切地知道它在做什么。我已经根据 this answer 为 Oracle 设置了 Java Util Logging , 尝试在我能做到的最低水平上捕捉事物。
我的应用程序正在使用 Hibernate(当前为 3.2.3.ga)。
当我使用 oracle.jdbc.level=CONFIGoracle.jdbc.level=FINE在我的 logging.properties ,看到相当合理的日志记录级别,但我没有看到我的应用程序发出的任何更新语句。我只看到 select 和 delete 语句,例如:

CONFIG oracle.jdbc: 73FCEAC9 SQL: select <REDACTED FOR STACK OVERFLOW>
当我使用 oracle.jdbc.level=FINEST在我的 logging.properties ,请参阅更新和插入语句,但日志记录量远大于实际值。似乎他们被 FINEST 的代码捕获到“记录对内部方法的调用”设置,并且单个更新语句将在日志中出现数十次。下面是一个例子:
FINEST oracle.jdbc: 212E0078 Enter: "update <REDACTED FOR STACK OVERFLOW>" 
FINEST oracle.jdbc: 212E0078 Enter: "update <REDACTED FOR STACK OVERFLOW>", -1, -1
FINEST oracle.jdbc: 212E0078 Enter: "update <REDACTED FOR STACK OVERFLOW>", "[ {result_set_type=-1} {use_long_fetch=false} {result_set_concurrency=-1} ]"
FINEST oracle.jdbc: 212E0078 Enter: "update <REDACTED FOR STACK OVERFLOW>", "[ {result_set_type=-1} {use_long_fetch=false} {result_set_concurrency=-1} ]"
FINEST oracle.jdbc: 212E0078 Enter: void
FINEST oracle.jdbc: 212E0078 Return: void
FINEST oracle.jdbc: 212E0078 Exit: [0.012976 ms]
FINEST oracle.jdbc: 2C5FB90F Enter: oracle.jdbc.driver.T4CConnection@212e0078, "update <REDACTED FOR STACK OVERFLOW>", "[ {result_set_type=-1} {use_long_fetch=false} {result_set_concurrency=-1} ]"
FINEST oracle.jdbc: Enter: oracle.jdbc.driver.T4CConnection@212e0078
FINEST oracle.jdbc: Return: void
FINEST oracle.jdbc: Exit: [0.012198 ms]
FINEST oracle.jdbc: Enter: oracle.jdbc.driver.T4CConnection@212e0078, "[ {result_set_type=-1} {use_long_fetch=false} {result_set_concurrency=-1} ]"
FINEST oracle.jdbc: Enter: oracle.jdbc.driver.T4CPreparedStatement@9887002
FINEST oracle.jdbc: Return: void
FINEST oracle.jdbc: Exit: [0.016657 ms]
我会假设 oracle.jdbc.level=FINE设置应该捕获更新语句,因为 documentation说它记录“将进入和退出记录到每个公共(public)方法,提供 JDBC 操作的详细跟踪”,但它记录的内容几乎与 oracle.jdbc.level=CONFIG 完全相同。 .
我尝试过以下 Oracle 驱动程序(采用 Gradle 依赖格式):
compile group: 'com.oracle.database.jdbc.debug', name: 'ojdbc8_g', version: '12.2.0.1'

compile group: 'com.oracle.database.jdbc.debug', name: 'ojdbc8_g', version: '21.3.0.0'
有什么方法可以配置 Oracle 驱动程序来记录所有选择、更新、插入和删除语句,而不是其他太多?我也试过设置 oracle.sql.level=FINEoracle.level=FINER ,但似乎没有在这些级别或更高级别记录有关更新的有用信息。
更新
我设置了 p6spy,它也无法记录插入和更新语句。然而 this answer solved that problem通过启用批次记录。在这里记录的 Oracle 驱动程序是否会做同样的事情,而不是在 CONFIG 记录批量更新?等级?

最佳答案

在 java.util.logging 中,您有两种方法可以选择日志中显示的消息:

  • 类别,由开发人员设置为 oracle.jdbc
  • 您已经检查过的日志级别至少需要为 finest在配置日志记录时您无能为力。

  • 但也有替代方案:
    如果应用程序在您的控制之下,请将日志记录添加到所有更新调用中。
    如果应用程序不在您的控制之下,或者您想要一个通用的解决方案,请选择包装器。您定义了一个可以记录您的请求的 JDBC 驱动程序(可以根据您的需要进行精细配置),但随后它将所有调用转发到真正的 JDBC 驱动程序。

    关于java - 如何以合理的方式使用 Oracle 驱动程序的日志记录来记录 UPDATE 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69533236/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com