tomcat - Tomcat连接池ThrowableCallStack问题
问题描述
在Tomcat8.5中有时会发现以下日志。当我们观察错误堆栈跟踪时,我们没有在代码中发现任何连接泄漏,但有时会捕获日志。我无法识别这是否表明连接泄漏或任何其他问题。
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)
这是什么,
org.apache.tomcat.dbcp.pool2.impl.ThrowableCallStack$Snapshot
我们什么时候得到这个问题。我们如何重现这个问题?
解决方案
您正在运行的 Web 应用程序已logAbandoned
为资源池激活标志。每当应用程序获取新的 JDBC 连接时,Pool 将花费(开销)时间并将调用堆栈跟踪记录在内存中。每当它后来发现 JDBC 连接没有正确关闭时,它就会获取该堆栈跟踪快照并将其转储到日志中,指向获取连接的确切位置(Java 源文件和行,如果为调试而编译)没有安全关闭,冒着连接泄漏的风险。
可再现性很大程度上取决于应用程序实际执行的操作和时间。如果发生这种情况有几个附带条件,可能很难重现,但是您可以从堆栈跟踪中读取它发生的实际位置,并可能分析源代码,找到有罪的代码行,甚至可能责怪开发商;-)
推荐阅读
- c++ - 为什么使用默认构造函数构造的 std::string 对象表现不同?
- roku - Roku 中的多个组件如何处理焦点?
- sql-server - 与内部联接一起使用时,东西函数返回重复记录
- android - 在 Android 10 中,如何使用 ADB 跟踪应用程序的网络统计信息 (netstats)
- python - 舍入输出值
- docker - 如何使用 shell 脚本执行 docker 容器并进入该容器并运行 cron 作业?
- javascript - 模态脚本在页面上始终打开相同的模态
- excel - 如果满足多个条件,则将重复的单元格值计为一个
- jquery - 分页时数据表列宽自动增加
- python - pip 或 conda 安装要求与代理背后的本地和外部依赖项