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

解决方案 »

  1.   

    嗯 这个设置做过了 而且设置30S,没有任何效果。还设置了C3P0连接池的连接轮唤为120s,尝试尽快释放无效连接,效果还是很不理想...
      

  2.   

    嗯 这个设置做过了 而且设置30S,没有任何效果。还设置了C3P0连接池的连接轮唤为120s,尝试尽快释放无效连接,效果还是很不理想...
      

  3.   

    谢谢 C3P0连接池配置我是从网上找的 因为我发现大部分都是这么写的。不知道兄弟有成熟的C3P0配置,可否共享一下!? “尝试多次链接数据库”这个问题我也有做,因为我在系统中做了一个基于Applet的多文件拖拽上传,每次上传多个文件时,就会多次访问数据库,就悲剧导致了开启的多个数据库连接没有释放。让人痛不欲生的是这些连接能保持24个小时以上...
      

  4.   

    我也遇到了,我的是偶尔拿不到连接,出现这样的异常信息,“cannot open connection” 我以前用的就是现在这个配置,多个项目都没有出现这个问题。求答案....
       我不同意6L的说话,你既然都使用了连接池,连接池的作用什么
         1.用来创建我们需要的连接(配置范围内的)
         2.即使我们的程序出现了异常,但是之后连接池应该去检查有没有空闲的连接,如果有则将其关闭或是其他的操作,而不是不管他。按照6L的理解就是我们的程序出现了异常,连接池就不管我们异常使用的连接,是不对的。
          lz如果你的问题解决了,请详细 [email protected] 谢谢!!!!!
      

  5.   

    试着用别的连接池,比如 Proxool 连接池,它目前使用的也多
      

  6.   

    我使用了log4j做了Debug 的确程序中出现了MyEclipse控制台没有打印出来的异常  可是解决异常之后  系统还是会出现连接泄漏问题  求解释!!
      

  7.   

    1、贴下改后的log异常日志。
    2、监控下,出现泄露时的数据库情况。
    3、不一定是连接池的事。
      

  8.   

    汗,竟然把 c3p0 替换成 dbcp,无语了!
      

  9.   

    是不是连接过大,使用系统命令 netstat -anp | grep 1521 马上就能看出来!
      

  10.   

    关于这个数据库连接泄漏问题 我现在项目的中没再出现过,对于大家热心关注,我表示非常感激。下面我把我在项目中采取的措施总结如下:
    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调试系统,调试系统中出现的控制台未打印出的异常,避免因为系统异常导致的连接未释放问题
    从目前的系统运行情况看,感觉相当稳定,连接能够迅速释放,暂没发现问题。但是上面采取的措施涉及到的一些原理还不是很理解,很愿意和大家一起讨论数据库连接泄漏的问题处理,希望大侠们也不吝赐教!!
      

  11.   

    项目中是否用到了 OSIV 用于展示延迟加载的数据,可能会导致session开启时间过长,而延长connection 的占用时间。