用CXF+Hibernate+Spring+MySql做WebService项目,访问数据库一段时间后,一直出现“Too Many Connection”错误,然后数据库就不能访问了(连接失败,当然不能操作了)
进入MySql Command窗口,键入命令:
show processlist;
发现数据库里有几百个连接,而且都是Sleep状态。默认情况下,MySql的最大连接是100 或150 (看你的MySql版本),这么多Sleep的连接,马上就会把连接上占满。
到网上找了n久,都是讲用C3P0或其它连接池,或者用其它临时方案,kill掉连接。
其实分析原因,无非就是DbConnect创建了没有关闭。但问题是,对于WebServer,连接池的原理也是希望能够保持长连接,不可能手动关闭的。
解决方案一:
手动修改MySql的最大连接数到500到1000,就不会有这个错误了。
问题是,观察下来,这个连接数一直在增加,不一会儿就到了300+,之后就稳定下来。当然,增加一台服务器,连接数又增加。这个隐患太大了,以后要是连接个几十台服务器,这MySql还不要挂掉了。min
解决方案二:
分析下来,很可能还是自己代码的原因。就狂看代码,最后发现原因:每个Dao都有一份SessionFaction实例。
数据库的连接是SessionFactory来负责的,你可是调试下,每创建一个SessionFactory,就会增加n个连接(n是你在cfg.xml文件里配置的min_size),这可不得了,每个Project都有n多个Dao,这样很快连接数就满了。最好的办法还是一个Service使用一个SessionFaction实例,这样,连接数就控制在min_size和max_size之间。
最后的解决方案是,采用单例模式生成SessionFactory实例,所以Dao使用同一factory。测试下来,一个Service只有几个连接了。