求救SSH系统性能问题-数据库连接泄漏问题

小肖2015 2012-01-16 10:28:56
这段时间一直被一个SSH系统性能问题困扰,项目在开发过程中出现Tomcat假死的问题。为了查清系统问题的原因,我找了个SIW软件用来监控系统占用端口,发现数据库连接数时常达到连接池设置的最大连接数。我使用的C3P0连接池,我一开始认为是连接池设置问题,可是问题没有解决。然后开发小组开始修改SSH配置文件,貌似系统偶尔能释放部分数据库连接,可是问题还是没有解决。
后来请教了一技术牛人,我们修改了连接池,把C3P0连接池换成DBCP连接池,并且把连接池配置由hibernate.cfg.xml配置文件中迁移到了Spring配置文件中(为了节省时间,我也就不贴连接池配置的代码了),这下系统能释放大部分连接。可是通过监控发现,保持的数据库连接数还是多于连接池配置的空闲连接数,而且时间一久,系统还是会出现卡死的问题,估计就是连接池保持的连接已经失效导致的。
今天下午,我又上网查了这方面的系统问题的介绍资料,偶尔发现网上介绍JConsole监控JVM和开启线程的相关技术(这里我也不介绍JConsole技术,因为网上实在太多了),了解到JVM设置和数据库连接泄漏都会导致系统问题。因为我对JConsole监控信息是如何反映系统问题不是很了解,所以就将感觉能反映系统性能问题的监控信息贴出来,希望大牛们能明白。


由于在帖子中,我还没摸索出如何将我监控数据的图片贴上,所以暂时将具体信息贴到了我的博客中,希望我提供的信息还算完善。我的博客地址:http://blog.csdn.net/rogerxp/article/details/7203315
...全文
402 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
bruce2922 2012-12-18
  • 打赏
  • 举报
回复
项目中是否用到了 OSIV 用于展示延迟加载的数据,可能会导致session开启时间过长,而延长connection 的占用时间。
caosenq 2012-03-24
  • 打赏
  • 举报
回复
好哪呢
小肖2015 2012-03-24
  • 打赏
  • 举报
回复
可能每个项目都有自己的特殊情况,我提供的某些措施在解决自己的问题方面或许比较适合,大家为什么不愿意讨论一下针对数据库连接泄漏问题可能出现的各方面原因以及相应对策呢,这样也便于大家以后碰到此类问题不至于心中没有概念吧!!
小肖2015 2012-03-19
  • 打赏
  • 举报
回复
关于这个数据库连接泄漏问题 我现在项目的中没再出现过,对于大家热心关注,我表示非常感激。下面我把我在项目中采取的措施总结如下:
1. 系统采用DBCP连接池,并将数据源及连接池配置到Spring配置文件中,不再使用hibernate原生配置文件hibernate.cfg.xml
2. 在Action层的代码中注入的service实体只有set方法,删除所有的get方法(经过测试,getXXService()严重导致系统无响应的情况)
3. struts2跳转配置分别配置为继承自struts-default的普通V-C的页面跳转和继承自json-default的异步数据加载页面配置
4. 将数据库由MySQL换为Oracle,避免MySQL的8小时自动断开连接问题
5. 使用log4j调试系统,调试系统中出现的控制台未打印出的异常,避免因为系统异常导致的连接未释放问题
从目前的系统运行情况看,感觉相当稳定,连接能够迅速释放,暂没发现问题。但是上面采取的措施涉及到的一些原理还不是很理解,很愿意和大家一起讨论数据库连接泄漏的问题处理,希望大侠们也不吝赐教!!
  • 打赏
  • 举报
回复
是不是连接过大,使用系统命令 netstat -anp | grep 1521 马上就能看出来!
  • 打赏
  • 举报
回复
汗,竟然把 c3p0 替换成 dbcp,无语了!
小肖2015 2012-03-19
  • 打赏
  • 举报
回复
对不住大家了啊 这段时间有些忙 没怎么来论坛逛了
lixinreal 2012-02-29
  • 打赏
  • 举报
回复
1、贴下改后的log异常日志。
2、监控下,出现泄露时的数据库情况。
3、不一定是连接池的事。
小肖2015 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ldh911 的回复:]
连接泄漏为啥总是找连接池的问题?应该首先是找程序的问题吧?找到哪里没有释放数据库连接,尤其是可能因为异常而导致没有释放连接的代码,连接池的主责不是用来关闭泄漏的连接的。
[/Quote]
我使用了log4j做了Debug 的确程序中出现了MyEclipse控制台没有打印出来的异常 可是解决异常之后 系统还是会出现连接泄漏问题 求解释!!
Iamagril 2012-02-14
  • 打赏
  • 举报
回复
试着用别的连接池,比如 Proxool 连接池,它目前使用的也多
cjoy4856 2012-01-18
  • 打赏
  • 举报
回复
我也遇到了,我的是偶尔拿不到连接,出现这样的异常信息,“cannot open connection” 我以前用的就是现在这个配置,多个项目都没有出现这个问题。求答案....
我不同意6L的说话,你既然都使用了连接池,连接池的作用什么
1.用来创建我们需要的连接(配置范围内的)
2.即使我们的程序出现了异常,但是之后连接池应该去检查有没有空闲的连接,如果有则将其关闭或是其他的操作,而不是不管他。按照6L的理解就是我们的程序出现了异常,连接池就不管我们异常使用的连接,是不对的。
lz如果你的问题解决了,请详细 joylovenba@163.com 谢谢!!!!!
MiceRice 2012-01-18
  • 打赏
  • 举报
回复
连接泄漏为啥总是找连接池的问题?应该首先是找程序的问题吧?找到哪里没有释放数据库连接,尤其是可能因为异常而导致没有释放连接的代码,连接池的主责不是用来关闭泄漏的连接的。
小肖2015 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangzhen9527 的回复:]
感觉应该还是c3p0配置问题,如果确实没有什么问题,可以检查一下代码,在代码中有没有重新修改配置。

也可以做个测试,尝试多次链接数据库,然后等链接销毁后,具体连接池是怎么处理的,或许可以在这上面可以找找原因。
[/Quote]
谢谢 C3P0连接池配置我是从网上找的 因为我发现大部分都是这么写的。不知道兄弟有成熟的C3P0配置,可否共享一下!? “尝试多次链接数据库”这个问题我也有做,因为我在系统中做了一个基于Applet的多文件拖拽上传,每次上传多个文件时,就会多次访问数据库,就悲剧导致了开启的多个数据库连接没有释放。让人痛不欲生的是这些连接能保持24个小时以上...
小肖2015 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ken_cq 的回复:]
把检查空闲连接的时间设短一点
[/Quote]
嗯 这个设置做过了 而且设置30S,没有任何效果。还设置了C3P0连接池的连接轮唤为120s,尝试尽快释放无效连接,效果还是很不理想...
小肖2015 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 rogerxp 的回复:]
这段时间一直被一个SSH系统性能问题困扰,项目在开发过程中出现Tomcat假死的问题。为了查清系统问题的原因,我找了个SIW软件用来监控系统占用端口,发现数据库连接数时常达到连接池设置的最大连接数。我使用的C3P0连接池,我一开始认为是连接池设置问题,可是问题没有解决。然后开发小组开始修改SSH配置文件,貌似系统偶尔能释放部分数据库连接,可是问题还是没有解决。
后来请教了一技术牛人,我们修改了连……
[/Quote]
嗯 这个设置做过了 而且设置30S,没有任何效果。还设置了C3P0连接池的连接轮唤为120s,尝试尽快释放无效连接,效果还是很不理想...
wangzhen9527 2012-01-17
  • 打赏
  • 举报
回复
感觉应该还是c3p0配置问题,如果确实没有什么问题,可以检查一下代码,在代码中有没有重新修改配置。

也可以做个测试,尝试多次链接数据库,然后等链接销毁后,具体连接池是怎么处理的,或许可以在这上面可以找找原因。
ken_cq 2012-01-16
  • 打赏
  • 举报
回复
把检查空闲连接的时间设短一点

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧