0

我们有一个大型企业,其中包含许多由 Oracle 10G 支持的新旧应用程序。当阻塞会话或死锁发生并且我们得到跟踪报告时,能够在 sql 中嵌入一些详细信息将非常方便,这样我们就可以知道是什么应用程序,特别是它是从哪里执行的。除了帮助加快解决时间之外,它还可以帮助我们找到业务流程相互踩踏的地方。我们对如何实现这一点有一些想法,但我很好奇这是否已经是一个已解决的问题。任何成功(或其他)尝试的想法或细节将不胜感激。

4

5 回答 5

2

您可以通过 Oracle DBMS_APPLICATION_INFO包标记正在执行的 SQL 块。这适用于任何应用程序语言,适用于数据库引擎本身,并且不会使您的 SQL 语句与注释混淆(无论如何,智能注释都是邪恶的)。更重要的是,Oracle 的各种工具可以识别数据并帮助您在故障排除或调优时使用它。

于 2008-12-22T19:03:15.473 回答
0

我们动态地修改我们的 SQL 语句,以便执行它们的命令位于查询开头的注释中。这是有效的,因为我们进行自己的事务管理并拥有严格的框架。但基本代码很简单(在 Java 中......不确定其他语言将如何处理):

String sql = "SELECT * FROM USERS WHERE ID = ?";
Connection con = getConnection();
PreparedStatement ps = con.prepareStatement(getComment() + sql);
// etc

String getComment() {
  return " /* " + getCommandName() + " */ ";
}

JDBC 驱动程序完整地传递注释,并在 DBA 检查查询时显示在数据库中。为此,我们的命令架构维护了一个线程本地的命令名称堆栈。此外,我们的连接工厂用我们自己的连接对象包装了 JDBC 连接,这样即使人们针对裸机 Connection 实例进行编程,也可以使用此代码,而不是使用我们通常使用的友好帮助方法。

于 2008-12-22T16:26:45.443 回答
0
Properties jdbcProperties = new Properties();

this.jdbcProperties.put("user", userName);
this.jdbcProperties.put("password", password);
this.jdbcProperties.put("v$session.program", "YourApplicationName");
DriverManager.getConnection(url, jdbcProperties);

然后通过针对您的连接的程序列分组来检查 v$session,就这么简单..

于 2008-12-22T21:36:53.353 回答
0

“我们知道什么应用程序,特别是它是从哪里执行的”您没有提及您的应用程序是用什么编写的。当从 PLSQL 程序发出 SQL 时,11g 会获取其他信息,您可能需要记住这些信息,具体取决于根据您的环境、潜在的数据库升级时间范围以及代码更改所涉及的工作量。如果从多个应用程序发出相同的 SQL,它将(大部分)在 v$sql 中只有一个条目,因此您可能无法将其追溯到一个应用程序。

于 2008-12-22T22:08:44.413 回答
0

我想在 sql 语句中嵌入注释,以便在 tkprof (10.2.0.4) 中一直标记它们。似乎在某些时候删除了斜线星号或双连字符注释。然后我使用了一个假 sql 提示的语法,它确实通过 tkprof 持续存在,例如

/*+ testrun=4A */  

数据库忽略它,它满足我的需求。

于 2013-05-30T17:12:32.373 回答