【问题标题】:How to trace the connection pool in a Java Web application - DBMS_APPLICATION_INFO如何在 Java Web 应用程序中跟踪连接池 - DBMS_APPLICATION_INFO
【发布时间】:2010-10-24 04:17:28
【问题描述】:

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

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

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

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

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

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

using DBMS_APPLICATION_INFO with Jboss

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

谢谢。

【问题讨论】:

  • 从 DBA 的角度来看,应用程序开发人员通常不会这么想。我赞赏您将其合并到您的数据库访问层中。在我无法让开发人员在数据库访问层代码中添加对 SET_IDENTIFIER 的调用的情况下,我会保留一个登录触发器。

标签: java oracle hibernate logging application-pool


【解决方案1】:

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

需要考虑的两点:

  1. 在繁忙的系统上,这将生成一个大日志文件。
  2. 频繁的连接不一定表示会降低数据库性能。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2011-05-06
        相关资源
        最近更新 更多