关于c3p0连接池线上Bug的排查

  • 问题描述
    • 查看服务器进程
    • tomcat输出日志查看
    • 查看当前打开文件大小
    • 日志分析
    • 查看c3p0配置信息
    • jdbcutils工具类查看
    • 总结

问题描述

在一个很突然的时刻,某一台应用服务器挂掉了。该台服务器承载的是一个单体应用,并发量也很小,下面开始排查…

查看服务器进程

①通常在linux服务器上我们查看进程使用的是ps -ef | grep tomcat(使用tomcat作为应用服务器)
②同样也可以使用 jps -l 命令查看当期正在运行的java进程

tomcat输出日志查看

我们看到进程是正常的,接下来查看日志输出情况
进入到tomcat/logs目录下
输入命令 tail -f catalina.out查看当前是否有日志输出

java.io.IOException:打开的文件过多
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:54)
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:54)
at java.lang.Runtime.execInternal(Native Method)
at java.lang.Runtime.exec(Runtime.java:551)
at java.lang.Runtime.exec(Runtime.java:477)
at java.lang.Runtime.exec(Runtime.java:443)

查看当前打开文件大小

lsof -p 直接查看打开的文件
lsof -p | wc -l 查看打开文件的数量 (65560)

然后我们可以查看一下当前服务器支持的最大文件打开数量:
ulimit -a

这里好像已经没有设置最大打开文件数量的空间了

日志分析

我们将服务器的运行日志拷贝到本地,截取服务器挂掉的那个时间段,进行一波日志查看

这里显示这个web应用的实例已经停止,为了调试以及试图终止导致非法访问的线程,将引发以下堆栈跟踪。
通过C3P0PooledConnectionPoolManager[identityToken->10q1nwma11dqw4ut1ya84pd|3384a844, dataSourceName->oracle]-HelperThread-#2这条信息,假象是c3p0连接池出了问题,拿不到连接导致应用停止。

查看c3p0配置信息


到这里仍然没有问题,那会不会是工具类的问题呢?

jdbcutils工具类查看

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

public class JdbcUtils {private static  Properties properties = null;public static Connection getOConnection() {//通过标识名来创建相应连接池ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");/*Connection con = dataSource.getConnection();return  con;*/try {return dataSource.getConnection();} catch (Exception e) {// logger.error("Exception in C3p0Utils!", e);throw new RuntimeException("数据库连接出错!", e);}}//释放连接回连接池public static void close(Connection conn, PreparedStatement pst, ResultSet rs){if(rs!=null){try {rs.close();} catch (SQLException e) {//logger.error("Exception in C3p0Utils!", e);throw new RuntimeException("数据库连接关闭出错!", e);}}if(pst!=null){try {pst.close();} catch (SQLException e) {//logger.error("Exception in C3p0Utils!", e);throw new RuntimeException("数据库连接关闭出错!", e);}}if(conn!=null && conn.isClosed()){try {conn.close();} catch (SQLException e) {// logger.error("Exception in C3p0Utils!", e);throw new RuntimeException("数据库连接关闭出错!", e);}}}
}

到这里问题应该是一目了然了。。。
由于每次从c3p0连接池获取连接的时候都会初始化一个dataSource来占用连接池中的一条连接,并且在调用conn.close()之后,只会释放,并不会关闭,所以理论上在调用几次之后,连接池应该已经干涸了。。。

我们将这段代码放到全局中,只要一加载工具类,就初始化一个dataSource就好了
ComboPooledDataSource dataSource = new ComboPooledDataSource(“oracle”);

总结

这个时候一定要会甩锅。。。这个代码不是我写的!!!
然后下次一定不能犯这么蠢的问题。

c3p0连接池拿不到连接导致系统崩溃的问题解决相关推荐

  1. 连接池原理介绍+常用连接池介绍

    下面以访问MySQL为例,执行一个SQL命令,如果不使用连接池,需要经过哪些流程. 不使用数据库连接池的步骤: TCP建立连接的三次握手 MySQL认证的三次握手 真正的SQL执行 MySQL的关闭 ...

  2. JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生

    一.为什么我们要用连接池技术? 前面的数据库连接的建立及关闭资源的方法有些缺陷.统舱传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开.关闭该物理连接, 系统性能严重受损. 解 ...

  3. ado.net mysql 连接池_ADO.NET数据连接池

    [IT168 技术文档]21世纪什么最贵?数据库连接.对于以数据库做数据存储基石的应用系统来说,数据库连接是整个系统中最珍贵的资源之一.数据库连接池是为了更有效地利用数据库连接的最重要措施.它对于一个 ...

  4. 04 | 连接池:别让连接池帮了倒忙

    04 | 连接池:别让连接池帮了倒忙 连接池一般对外提供获得连接.归还连接的接口给客户端使用,并暴露最小空闲连接数.最大连接数等可配置参数,在内部则实现连接建立.连接心跳保持.连接管理.空闲连接回收. ...

  5. 连接池:别让连接池帮了倒忙

    今天,我再与你说说另一种很重要的池化技术,即连接池. 我先和你说说连接池的结构.连接池一般对外提供获得连接.归还连接的接口给客户端使用,并暴露最小空闲连接数.最大连接数等可配置参数,在内部则实现连接建 ...

  6. springboot2整合redis使用lettuce连接池(解决lettuce连接池无效问题)

    lettuce客户端 Lettuce 和 Jedis 的都是连接Redis Server的客户端程序.Jedis在实现上是直连redis server,多线程环境下非线程安全(即多个线程对一个连接实例 ...

  7. druid连接池mysql自动关闭_druid连接池

    近期一直报连接池连接的错误,主要就是那个什么last packet 多少ms以前. 所以就研究了下. druid连接池和mysql的连接关系可以简单理解为下面的案例. 有10个接线员A和远程10个接口 ...

  8. MySQL会回收使用中的连接吗_Node.js实现mysql连接池使用事务自动回收连接的方法示例...

    本文实例讲述了Node.js实现mysql连接池使用事务自动回收连接的方法.分享给大家供大家参考,具体如下: var mysql = require('mysql'), Connection = re ...

  9. 连接池超时配置_HttpClient连接池的一些思考

    前言 使用apache的httpclient进行http的交互处理已经很长时间了,而httpclient实例则使用了http连接池,想必大家也没有关心过连接池的管理.事实上,通过分析httpclien ...

最新文章

  1. 通过Google挖掘细分市场的一个案例
  2. EBS 11i数据库升级(9i-10g)几点事项
  3. 25个经典的Spring面试问答
  4. java java.lang.Long详解之三 大显神通的位移运算
  5. Java黑皮书课后题第10章:*10.26(计算器)修改程序清单7-9,接收一个字符串表达式,其中操作符和操作数由0到多个空格隔开
  6. 扫描PDF417崩溃的原因找到:手机摄像头分辨率低
  7. SUN公司经典linux教材转自http://blog.chinaunix.net/uid-20446831-id-1677336.html
  8. python装饰器详解-Python 函数装饰器
  9. ffmpeg推送直播流的技术进展
  10. mysql查询4-6_MySQL学习(四)查询
  11. Git遇到Unable to create 'E:/xxx/.git/index.lock': File exists.的解决办法
  12. 无法访问共享计算机文件,电脑无法访问共享文件怎么解决?
  13. 600,000,002,200,300,400等开头的股票都是什么意思
  14. win8.1系统中迅雷看看闪退问题
  15. 正则表达式前端使用手册
  16. [2015 Springer] Local Image Descriptor: Modern Approaches——3 Intensity Order-Based Local Descriptors
  17. 腾讯云企业网盘正式入驻数字工具箱
  18. 【机试题(实现语言:python3)】学英语-递归或字符串
  19. 安徽省省二c语言题库及答案,07_06省二级选择题题库C语言(含答案)
  20. c语言程序设计拉丁方阵结构图,C语言程序设计100例之(29):拉丁方阵

热门文章

  1. jersey (RESTful Web Service框架)
  2. 成功解决:[object Object]
  3. 鱼眼相机去畸变 Python/C++实现
  4. [写Bug记录] Maven出现 Library xxx has broken classes paths
  5. Win10删除顽固文件
  6. 最新各大CMS采集资源站解析网址合集
  7. 计算机网络实验之Wireshark 实验
  8. c3p0连接池报错 A client timed out while waiting
  9. 常州大学新生赛 F-大佬的生日礼包
  10. 西北乱跑娃 -- python识别二维码