我的这个 Java 应用程序仍在通过 JDBC 代码与 Oracle 11g 进行通信。话虽如此,想要检查该应用程序对 Oracle 历史记录的查询(如果已经存在)。
要查看的关键项目:
?
),通过java.sql.PreparedStatement
传递)预期结果:
尝试使用下面的查询,但它没有返回上面列出的关键项目:
select * from v$sql order by last_load_time desc
正如其他成员已经指出的那样,
V$SQL
、V$SQL_BIND_CAPTURE
和V$SQLAREA
应该为您提供关于 Java 应用程序触发的查询的大量信息。
请注意,这可能不是完整的时间历史。假设 Java 应用程序对数据库进行大量查询,则可能并非所有查询都存在于 V$SQL 中(例如:解析失败的查询、仅使用一次且不再在缓存中的查询等)可能会被遗漏出去)。此外,如果查询被触发两次(使用相同或不同的绑定变量集),您将在
V$SQL
中仅找到最新的执行条目
如果您的目标是按完美的时间顺序查找所有查询(作为 Java 应用程序的某种黑盒研究),那么我建议您启用特定会话的跟踪(由
SID, SERIAL#
中的 V$SESSION
标识)。这将提供多个方面的信息,包括查询触发顺序、绑定变量、查询性能等。请查看this链接以获取更多信息。可以进行不同类型和级别的信息收集。另外,它的性能开销,如果您计划在任何生产系统上使用它,请考虑这个因素
下面的查询应该返回您需要的信息
select vsql.sql_text, vses.SCHEMANAME, vsql.ELAPSED_TIME, vses.USERNAME
from v$session vses join v$sql vsql
on vses.sql_id=vsql.sql_id
where contdition;