启动报Cannot get connection for url jdbc xxxx listener could not hand off client co

刚开始碰到这个错误的时候一头雾水 虽说错误原因很明显 就是数据库获取不到连接了。查看发现无法从连接池获取连接,连接已经达到最大数。
但是算来算去,感觉不太可能达到最大连接数,因为程序刚启动,虽说程序中使用了多个数据源,每个都有一个连接池,但分配的初始大小都是10,算来算去也就几十个连接数。不可能达到Oracle设置的最大连接数150。但查看数据库连接数发现,确实连接数达到了最大值。想了半天想不明白。因为都是自己在调试程序,没有别人在同时使用。而且是在启动的时候就报错了,然而并没有查询数据或别的什么需要获取多个连接的操作。再说即使真达到了最大连接,但是我重启tomcat按理说应该连接就释放了呀。
就想呀想呀,感觉又要怀疑世界,怀疑人生了,后来与同事讨论,突然有一个思路,是不是在调试的时候,每次都是直接杀死tomcat的进程,连接池的连接可能并没有释放掉。这样Oracle那边就还保持着这个连接的会话。由于调试期间又是频繁启动杀死tomcat,这样慢慢的积累,Oraclle里的连接越来越多而且都没有释放,因为还没到超时时间。然后在一次的启动中,几个连接池再申请十几二十个连接的时候,就会超过了数据库的最大连接数,这样就成了导致程序启动失败的最后一根稻草。
有了这个想法后,怀着激动的心情就开始实验验证,把数据库重启,释放多余的连接,把两个数据源的数据连接池的初始大小都改为50,然后启动,第一次启动成功,这是查询数据库的连接数,发现在120个左右。这是直接杀死tomcat的进程,再次查看连接数,发现还是120个左右,说明连接并没有释放。这时再次启动tomcat就会报错,因为这次剩余的连接数已经不够连接池申请的了。验证正确。
后来又把连接池的初始大小改小,发现直接停tomcat并不是每次Oracle的连接都不释放,有的时候tomcat直接停掉后,连接就会释放掉了。教给大家一个测试方法,在tomcat启动后断开网络,然后再停掉tomcat,这样与Oracle的连接就不会释放掉,就可以测试了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章