Tomcat连接池ThrowableCallStack问题

问题描述 投票:0回答:2

Tomcat8.5有时发现如下日志。当我们观察到错误时 stacktrace 我们没有在代码中发现任何连接泄漏,但在日志中 有时会被捕获。我无法识别这是否是 连接泄漏或任何其他问题的指示。

Pooled object created 2018-11-13 11:00:01 -0800 by the following code
has not been returned to the pool:
org.apache.tomcat.dbcp.pool2.impl.ThrowableCallStack$Snapshot   at
org.apache.tomcat.dbcp.pool2.impl.ThrowableCallStack.fillInStackTrace(ThrowableCallStack.java:71)
        at org.apache.tomcat.dbcp.pool2.impl.DefaultPooledObject.allocate(DefaultPooledObject.java:192)
        at org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:455)
        at org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361)
        at org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134)
        at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1543)
        at com.sample.test.db.SlaveDBConnection.initiateConnection(SlaveDBConnection.java:40)
        at com.sample.test.db.SlaveDBConnection.<init>(SlaveDBConnection.java:25)
        at com.sample.test.db.DBFactory.getDBObject(DBFactory.java:80)
        at com.sample.test.app.model.dao.UserDAOImpl.getUserData(UserDAOImpl.java:1795)
        at org.apache.jsp.getData_jsp._jspService(getData_jsp.java:298)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.MFilter.doFilter(MFilter.java:52)

这里是 ment by

org.apache.tomcat.dbcp.pool2.impl.ThrowableCallStack$Snapshot
以及何时 我们得到这个问题了吗?我们如何重现这个问题?

tomcat connection-pooling tomcat8.5
2个回答
4
投票

您正在运行的 Web 应用程序已为资源池激活了

logAbandoned
标志。每当应用程序获取新的 JDBC 连接时,池都会占用(开销)时间并将调用堆栈跟踪记录在内存中。 每当它稍后识别出 JDBC 连接尚未正确关闭时,它就会获取该堆栈跟踪快照并将其转储到日志中,指向获取连接的确切位置(Java 源文件和行,如果编译用于调试)尚未安全关闭,存在连接泄漏的风险。

可重复性很大程度上取决于应用程序实际执行的操作和时间。如果有几个附带条件会导致这种情况发生,则可能很难重现,但您可以从堆栈跟踪中发生的实际位置读取实际位置,并可能分析源代码,找到有问题的代码行,甚至可能将其归咎于开发人员;-)

请参阅 Tomcat 文档以进一步阅读此处


0
投票

如果您将“logAbandoned”设置为“false”,您将不会再收到这些消息。即使您收到这些消息,似乎也不会对您的数据库连接池产生负面影响。

© www.soinside.com 2019 - 2024. All rights reserved.