网站无端卡死

本文介绍如何通过配置 C3P0 数据库连接池来诊断和解决连接泄露问题,包括启用连接归还超时设置及 log 输出的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发了一个小型cms系统,其中有一个审核模块

每次审核到100条左右的时候,系统就会卡死,由于用的negix+tomcat

经常暴504错误,修改了negix配置,问题依然存在,困惑了一个月,今晚加班

想看看是不是c3p0的问题,于是开始逐条查看c3p0配置,果不其然

这条文章给了我很大帮助

http://blog.youkuaiyun.com/wozeze1/article/details/6037338


http://blog.youkuaiyun.com/kaishuaige/article/details/14451423

DatabaseConnectionLeak

使用C3P0连接池的连接泄露诊断方法

启用C3P0的连接归还超时设置

在C3P0的属性配置文件(0.datasource.config)中,设置以下属性:

debugUnreturnedConnectionStackTraces=true
unreturnedConnectionTimeout=1200

其中: debugUnreturnedConnectionStackTraces是一个开关,启用之后,对于每个从连接池拿出去的数据库连接,如果一段时间内没有归还,C3P0就会强制关闭这个连接,并将获取连接时的stack trace,以抛出异常的方式显示出来。 unreturnedConnectionTimeout设置多长时间会超时,以秒为单位。

假设系统中怀疑有连接泄露,那么,就可以启用这个功能,评估所有页面执行完成需要的最长时间,例如20分钟,然后将unreturnedConnectionTimeout设置为略大于这个时间。

设置C3P0的log输出

为了能看到C3P0抛出的异常信息,还需要设置C3P0的log属性。最简单的方式就是让C3P0使用JDK标准的log API,这样不需要加载额外的jar。在启动JVM时,设置启动参数: Dcom.mchange.v2.log.MLog=com.mchange.v2.log.jdk14logging.Jdk14MLog

在Tomcat中,可修改catalina.sh,设置JAVA_OPTS变量包含上述内容。

可以做一个测试:设置C3P0属性debugUnreturnedConnectionStackTraces=true,unreturnedConnectionTimeout=1,然后访问一个运行时间超过1秒的页面。这样,就会在tomcat的输出窗口看到这样一段信息:

信息: Logging the stack trace by which the overdue resource was checked-out.
java.lang.Exception: DEBUG ONLY: Overdue resource check-out stack trace.
	at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:<span class="hl-number">506</span>)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection
	(C3P0PooledConnectionPool.java:<span class="hl-number">525</span>)
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection
	(AbstractPoolBackedDataSource.java:<span class="hl-number">128</span>)
	at aurora.database.service.SqlServiceContext.initConnection(SqlServiceContext.java:<span class="hl-number">168</span>)
	at aurora.database.service.BusinessModelService.prepareForRun(BusinessModelService.java:<span class="hl-number">112</span>)
	at aurora.database.service.BusinessModelService.query(BusinessModelService.java:<span class="hl-number">188</span>)
	at aurora.database.actions.ModelQuery.doQuery(ModelQuery.java:<span class="hl-number">53</span>)
	at aurora.database.actions.AbstractQueryAction.query(AbstractQueryAction.java:<span class="hl-number">104</span>)
	at aurora.database.actions.AbstractQueryAction.run(AbstractQueryAction.java:<span class="hl-number">115</span>)
	at uncertain.proc.ProcedureRunner.run(ProcedureRunner.java:<span class="hl-number">253</span>)
	at uncertain.proc.ProcedureRunner.run(ProcedureRunner.java:<span class="hl-number">290</span>)
	at uncertain.proc.Procedure.run(Procedure.java:<span class="hl-number">94</span>)
	at uncertain.proc.ProcedureRunner.run(ProcedureRunner.java:<span class="hl-number">247</span>)
	at aurora.application.features.AbstractProcedureInvoker.runProcedure(AbstractProcedureInvoker.java:<span class="hl-number">40</span>)
	at aurora.application.features.InitProcedureInvoker.doInvoke(InitProcedureInvoker.java:<span class="hl-number">33</span>)
	at aurora.application.features.InitProcedureInvoker.onCreateModel(InitProcedureInvoker.java:<span class="hl-number">37</span>)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:<span class="hl-number">39</span>)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:<span class="hl-number">25</span>)
	at java.lang.reflect.Method.invoke(Method.java:<span class="hl-number">597</span>)
	at uncertain.proc.ReflectionMethodHandle.handleEvent(ReflectionMethodHandle.java:<span class="hl-number">93</span>)
	at uncertain.proc.ReflectionMethodHandle.handleEvent(ReflectionMethodHandle.java:<span class="hl-number">50</span>)
	at uncertain.event.Configuration.fireEventInternal(Configuration.java:<span class="hl-number">403</span>)
	at uncertain.event.Configuration.fireEvent(Configuration.java:<span class="hl-number">341</span>)
	at uncertain.proc.ProcedureRunner.fireEvent(ProcedureRunner.java:<span class="hl-number">312</span>)
	at uncertain.proc.Action.run(Action.java:<span class="hl-number">171</span>)
	at uncertain.proc.ProcedureRunner.run(ProcedureRunner.java:<span class="hl-number">253</span>)
	at uncertain.proc.ProcedureRunner.run(ProcedureRunner.java:<span class="hl-number">290</span>)
	at uncertain.proc.Procedure.run(Procedure.java:<span class="hl-number">94</span>)
	at uncertain.proc.Switch.run(Switch.java:<span class="hl-number">87</span>)
	at uncertain.proc.ProcedureRunner.run(ProcedureRunner.java:<span class="hl-number">253</span>)
	at uncertain.proc.ProcedureRunner.run(ProcedureRunner.java:<span class="hl-number">290</span>)
	at uncertain.proc.Procedure.run(Procedure.java:<span class="hl-number">94</span>)
	at uncertain.proc.ProcedureRunner.run(ProcedureRunner.java:<span class="hl-number">247</span>)
	at aurora.service.ServiceInstance.invoke(ServiceInstance.java:<span class="hl-number">124</span>)
	at aurora.service.http.AbstractFacadeServlet.service(AbstractFacadeServlet.java:<span class="hl-number">116</span>)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:<span class="hl-number">722</span>)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:<span class="hl-number">306</span>)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:<span class="hl-number">210</span>)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:<span class="hl-number">240</span>)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:<span class="hl-number">161</span>)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:<span class="hl-number">164</span>)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:<span class="hl-number">100</span>)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:<span class="hl-number">541</span>)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:<span class="hl-number">118</span>)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:<span class="hl-number">383</span>)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:<span class="hl-number">243</span>)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:<span class="hl-number">188</span>)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:<span class="hl-number">166</span>)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:<span class="hl-number">288</span>)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:<span class="hl-number">886</span>)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:<span class="hl-number">908</span>)
	at java.lang.Thread.run(Thread.java:<span class="hl-number">680</span>)

这就是C3P0发现连接1秒钟后没有归还,强制关闭连接后抛出的信息,从stack trace中可以看出,获取连接是发生在aurora.database.service.BusinessModelService.query,也就是调用BM的query。

由于页面确实是需要使用连接超过1秒,正在使用的连接被强制关闭以后,还会看到这样的信息:

<span class="hl-number">011</span>-<span class="hl-number">6</span>-<span class="hl-number">22</span> <span class="hl-number">13</span>:<span class="hl-number">24</span>:<span class="hl-number">15</span> com.mchange.v2.c3p0.impl.NewPooledConnection handleThrowable
警告: [c3p0] A PooledConnection that has already signalled a Connection error is still in use!

后续SQL操作再使用这个连接时,会发现连接已经关闭,于是就会抛出类似这样的异常:

<span class="hl-number">2011</span>-<span class="hl-number">6</span>-<span class="hl-number">22</span> <span class="hl-number">13</span>:<span class="hl-number">24</span>:<span class="hl-number">15</span> com.mchange.v2.c3p0.impl.NewPooledConnection handleThrowable
警告: [c3p0] Another error has occurred [ java.sql.SQLException: 关闭的连接 ] 
which will not be reported to listeners!
java.sql.SQLException: 关闭的连接
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:<span class="hl-number">134</span>)
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:<span class="hl-number">179</span>)
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:<span class="hl-number">269</span>)
	at oracle.jdbc.driver.OracleConnection.rollback(OracleConnection.java:<span class="hl-number">1439</span>)
	at com.mchange.v2.c3p0.impl.NewProxyConnection.rollback(NewProxyConnection.java:<span class="hl-number">855</span>)
	at aurora.transaction.UserTransactionImpl.rollback(UserTransactionImpl.java:<span class="hl-number">58</span>)
	at aurora.service.http.AbstractFacadeServlet.service(AbstractFacadeServlet.java:<span class="hl-number">141</span>)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:<span class="hl-number">722</span>)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:<span class="hl-number">306</span>)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:<span class="hl-number">210</span>)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:<span class="hl-number">240</span>)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:<span class="hl-number">161</span>)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:<span class="hl-number">164</span>)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:<span class="hl-number">100</span>)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:<span class="hl-number">541</span>)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:<span class="hl-number">118</span>)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:<span class="hl-number">383</span>)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:<span class="hl-number">243</span>)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:<span class="hl-number">188</span>)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:<span class="hl-number">166</span>)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:<span class="hl-number">288</span>)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:<span class="hl-number">886</span>)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:<span class="hl-number">908</span>)
	at java.lang.Thread.run(Thread.java:<span class="hl-number">680</span>)

### 解决 VSCode 中 LaTeX 的意外错误 在处理 VSCode 中的 LaTeX 报错问题时,通常可以从以下几个方面入手分析并解决问题: #### 1. **检查扩展配置** 确保安装了支持 LaTeX 编辑和编译的相关扩展。常用的扩展包括 `LaTeX Workshop` 和其他辅助工具。如果未正确配置这些扩展,则可能导致无法正常解析文件或生成 PDF 输出。 对于 `LaTeX Workshop` 扩展,需确认其设置是否符合项目需求。例如,在 settings.json 文件中定义构建命令以及路径环境变量等参数[^4]。 ```json { "latex-workshop.latex.tools": [ { "name": "pdflatex", "command": "pdflatex", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%" ] } ], "latex-workshop.view.pdf.viewer": "tab" } ``` #### 2. **验证语法结构** 有时错误可能源于文档本身的标记语言不规范。正如某些特定格式如 PML 不会显式指定章节层次级别而是由解析器自动推断一样[^1],LaTeX 对于嵌套关系也有严格的要求。任何遗漏的大括号 `{}` 或者不当使用的宏都可能会引发异常提示。 因此建议仔细审查源码中的每一处细节,尤其是涉及复杂布局或者引用外部资源的部分。 #### 3. **更新软件版本** 保持所有相关组件处于最新状态也很重要。这不仅限于编辑器本身还包括 MiKTeX/LuaTeX/XeTeX 等引擎及其配套包库。旧版可能存在已知缺陷从而影响正常使用体验[^5]。 可以通过终端执行如下指令来完成升级操作: ```bash sudo tlmgr update --self && sudo tlmgr update --all ``` 另外值得注意的是,当切换不同操作系统平台迁移工作目录时也要同步调整依赖项列表以防兼容性冲突发生。 --- ### 提供一段示例代码用于测试基本功能是否完好无损 下面给出了一段简单的 TeX 文档框架作为参考模板以便排查潜在隐患所在之处: ```tex \documentclass{article} % 导言区加载必要宏包 \usepackage[utf8]{inputenc} % 设置编码方式为 UTF-8 \usepackage[T1]{fontenc} % 字体编码方案设定 \usepackage{lmodern} % 使用 Latin Modern 字族替代默认 Computer Modern \title{Sample Document Title} \author{Name Surname} \date{\today} \begin{document} \maketitle \section*{Introduction} This is just a minimal example showcasing how things should look under normal circumstances... \[ e^{i \pi} + 1 = 0 \] \end{document} ``` 尝试运行以上脚本看能否顺利产出预期效果;倘若依旧存在障碍则进一步深入探究根本原因何在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值