日期:2014-05-19  浏览次数:20684 次

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


由于在帖子中,我还没摸索出如何将我监控数据的图片贴上,所以暂时将具体信息贴到了我的博客中,希望我提供的信息还算完善。我的博客地址:http://blog.csdn.net/rogerxp/article/details/7203315
------解决方案--------------------
感觉应该还是c3p0配置问题,如果确实没有什么问题,可以检查一下代码,在代码中有没有重新修改配置。

也可以做个测试,尝试多次链接数据库,然后等链接销毁后,具体连接池是怎么处理的,或许可以在这上面可以找找原因。
------解决方案--------------------
连接泄漏为啥总是找连接池的问题?应该首先是找程序的问题吧?找到哪里没有释放数据库连接,尤其是可能因为异常而导致没有释放连接的代码,连接池的主责不是用来关闭泄漏的连接的。
------解决方案--------------------
我也遇到了,我的是偶尔拿不到连接,出现这样的异常信息,“cannot open connection” 我以前用的就是现在这个配置,多个项目都没有出现这个问题。求答案....
   我不同意6L的说话,你既然都使用了连接池,连接池的作用什么
     1.用来创建我们需要的连接(配置范围内的)
     2.即使我们的程序出现了异常,但是之后连接池应该去检查有没有空闲的连接,如果有则将其关闭或是其他的操作,而不是不管他。按照6L的理解就是我们的程序出现了异常,连接池就不管我们异常使用的连接,是不对的。
      lz如果你的问题解决了,请详细 joylovenba@163.com 谢谢!!!!!

------解决方案--------------------
试着用别的连接池,比如 Proxool 连接池,它目前使用的也多
------解决方案--------------------
1、贴下改后的log异常日志。
2、监控下,出现泄露时的数据库情况。
3、不一定是连接池的事。
------解决方案--------------------
是不是连接过大,使用系统命令 netstat -anp 
------解决方案--------------------
 grep 1521 马上就能看出来!