sql-server - 列出未断开连接或未正确断开连接的数据库连接

标签 sql-server database hibernate tomcat jdbc

我正在使用带有 SQL Server 2008 的动态 Java Web 应用程序(Tomcat 8.0.15、Java EE 7 Web)并在收到警告/异常之后

WARNING [Tomcat JDBC Pool Cleaner[510210701:1481713957404]] org.apache.tomcat.jdbc.pool.ConnectionPool.suspect Connection has been marked suspect, possibly abandoned PooledConnection[net.sourceforge.jtds.jdbc.JtdsConnection@510fc080][67975 ms.]:java.lang.Exception

我常常想知道在源代码深处的某个地方,我忘记断开与数据库的 JDBC 或 Hibernate 连接。我想以某种方式列出它们。

一个普通的

static 
    {
        try {
            Context context = new InitialContext ();
            dataSource = (DataSource) context.lookup("java:comp/env/jdbc/sqlserv");
        } catch (NamingException ex) {
            Logger.getLogger(Basisverbindung.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

做那个工作,在我的 hibernate.cfg.xml 中是一样的:

<property name="hibernate.connection.datasource">java:comp/env/jdbc/sqlserv</property>  

我查看了 Stackoverflow,只发现了一些我已经查阅过(甚至投票赞成)的条目:

但问题仍然存在或在一段时间后再次出现,所以我想找到一种方法来追踪我忘记关闭连接的位置。在我的 Tomcat 上,还有一个 PSI 探测器在运行,告诉我请求中出现了一些错误,有时响应时间已达到最大值。 我在那里看到了一个很好的请求列表,但不知道哪些被放弃了。

SQL-Server Management Studio 中的 ActivityMonitor 没有太大帮助,它列出了很多我知道它们已关闭(或者应该关闭)的进程。

分析此类问题的最佳方法是什么?

最佳答案

您真正想要做的是启用“已放弃的连接”跟踪和报告。

您没有说明您使用的是哪个 Tomcat 的 JDBC 数据源池(有两个),但它们的配置类似:

  1. commons-dbcp2基于:logAbandoned=trueremoveAbandonedOnBorrow=true
  2. tomcat-jdbc基于:logAbandoned=trueremoveAbandoned=true

我总是建议每个人在开发环境中以 1 的最大池大小运行。这将帮助您非常快速识别池泄漏,并捕获您可能在代码中植入的任何潜在死锁。

关于sql-server - 列出未断开连接或未正确断开连接的数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41148106/

相关文章:

sql-server - SQL WHERE 子句中的加号是什么意思 (WHERE + userName = SYSTEM_USER)

sql-server - Azure 资源 SQL Server 防火墙设置不起作用

sql - 按跨年的日期范围(同一月和同一天)过滤

java - 如何创建未分页但已排序的 Pageable.of(unpaged, unpaged, Sort ) 到 spring 数据 jpa 存储库?

java - Hibernate 5 隐式策略和唯一键

sql-server - 有没有一种方法可以将主键上的非聚集索引转换为聚集索引? (SQL Server 2008)

sql-server - 与 Azure 的 SQL 数据同步不显示我的数据库

sql - 由于外键约束问题而插入 A 错误

android - 使用 sqlite 从表中获取每周总和数据

java - 具有附加约束的 @OneToOne 关系