4

我需要改进通常在固定数据库用户上运行的 Web 应用程序的可追溯性。DBA 应该能够快速访问有关降低数据库性能的重度用户的信息。

5 年前,我实现了一个 .NET ORM 引擎,它使用 DBMS_APPLICATION_INFO 包记录用户和服务器。在连接管理器上方使用包装器,代码如下:

DBMS_APPLICATION_INFO.SET_MODULE('" + 用户 + " - " + appServerMachine + "','');

每次连接从池中获得连接时,都会执行该包以将信息记录在 V$SESSION 中。

有没有人使用 Toplink 或 Hibernate 发现或实施了解决此问题的方法?这个问题有默认实现吗?

我在这里找到了我 5 年前实施的解决方案,但我想知道任何人都有更好的解决方案并与 ORM 集成。

将 DBMS_APPLICATION_INFO 与 Jboss 一起使用

我的应用程序在 Spring 之上,DAO 是用 JPA(使用休眠)实现的,并且实际上直接在 Tomcat 中运行,并计划(明年)迁移到 SAP Netwevare Application Server。

谢谢。

4

3 回答 3

3

在 Oracle 10g 中,我们可以使用DBMS_SESSION.SET_IDENTIFIER来唯一标识特定会话。Oracle 还提供了一个内置的 JDBC来将其挂接到连接池中。您必须提供自己的唯一标识会话的方法,这取决于您的应用程序。

然后,您的 DBA 将有足够的信息来识别资源匮乏的会话。

我所知道的任何 DBA 都会对从中间层生成的巨大文本文件印象深刻。

于 2009-08-02T08:33:46.627 回答
0

如果您想了解运行成本很高的查询,您应该直接进入您的数据库服务器。有针对每台服务器的监控工具。例如,在 PostgreSQL 中,您将以SELECT * FROM pg_stat_activity管理员身份运行以检查每个连接及其在做什么、运行了多长时间等。

如果您真的想/需要从容器中执行此操作,那么也许您可以使用 Spring AOP 定义一个拦截器,以在执行任何操作之前执行您需要的语句。请记住,数据库连接并不总是由同一个应用程序用户使用,因为您使用的是池。

于 2009-05-06T15:12:22.280 回答
0

您应该能够在您的连接池上配置一个记录器(例如 log4j)。您可能需要一个自定义附加程序来拉回用户 ID。

需要考虑的两点:

  1. 在繁忙的系统上,这将生成一个大日志文件。
  2. 频繁的连接不一定表明会降低数据库的行为。
于 2009-05-06T15:00:10.483 回答