我们有一个大型企业,包括许多由Oracle 10G支持的新老应用程序。当阻塞会话或死锁发生并且我们获得跟踪报告时,能够在sql中嵌入一些细节以便我们知道什么是应用程序,特别是从哪里执行它将非常方便。除了帮助加快解决时间外,它还可以帮助我们找到业务流程相互衔接的地方。我们对如何实现这一点有一些想法,但我很好奇这是否已经解决了问题。任何成功(或其他)尝试的任何想法或细节将不胜感激。
答案 0 :(得分:2)
您可以通过Oracle DBMS_APPLICATION_INFO包标记正在执行的SQL块。这适用于任何应用程序语言,在数据库引擎本身内工作,并且不会使用注释混淆SQL语句(无论如何,智能注释都是邪恶的)。更重要的是,Oracle的各种工具可识别数据并帮助您在进行故障排除或调整时使用它。
答案 1 :(得分: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连接,以便即使人们针对裸机连接实例进行编程而不使用我们通常使用的友好帮助器方法,也会出现此代码。
答案 2 :(得分: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,这很简单..
答案 3 :(得分:0)
“我们知道什么应用程序,和 特别是它被执行的地方 从” 您没有提到您的应用程序是什么写的.11g从PLSQL程序发出SQL时会获取其他信息,您可能需要记住这些信息,具体取决于您的环境,潜在的数据库升级时间范围以及代码更改所涉及的工作量。 如果从多个应用程序发出相同的SQL,它(通常)只会在v $ sql中有一个条目,因此您可能无法将其追溯到一个应用程序。
答案 4 :(得分:0)
我想在sql语句中嵌入注释,以便在tkprof(10.2.0.4)中一直标记它们。似乎在某些时候删除了斜线 - 星号或双连字符注释。然后我使用了伪sql提示的语法,它通过tkprof持续存在,例如
/*+ testrun=4A */
数据库会忽略它并满足我的需求。