共计 1332 个字符,预计需要花费 4 分钟才能阅读完成。
前言
简单描述一下场景,总共两台应用服务器,每台安装 3 个 tomcat 进行集群,并通过 nginx 做了负载均衡,今天在生产环境中部署项目后进行测试,发现在一台应用服务器中同样的代码,tomcat1 和 tomcat2 正常,而访问 tomcat3 时报 404 错误,去看了下 log 发现是数据库服务器出了问题:
然后登录到 DB 服务器去看看什么情况,结果登录时发现报以下错误:
居然已经登录不上了,根本原因就是因为 Oracle 的 process 和 session 已经达到甚至超过最大值了,接下来就详细说明一下解决方案。
查看 procress&session 的参数值和占用值
上面提到由于超过连接最大值导致无法登录,所以用 sys as dba 也是登录不上的,首先需要先断开占用的 procress,即停掉几个 tomcat 即可释放连接,接下来就可以登录了。在这里我停掉了所有 tomcat,再通过 sys 用户登录 sqlplus 看一下 procress 和 session 的参数值和占用值:
可以看到在没有任何在程序没有连接数据库的时候 procress 的占用值是 18,而参数值为 300,所有此时占用量很小,那么接下来分别启动应用服务器下的 tomcat,依次看一下应用服务器 1 下的第 1 个 tomcat,应用服务器 1 下的第 2 个 tomcat 和应用服务器 1 下的第 3 个 tomcat 之后,procress 占用值的变化~
启动第 1 个 tomcat 后访问主页:
启动第 2 个 tomcat 后访问主页:
启动第 3 个 tomcat 后访问主页:
不难发现每次 process 的值都增加了 60,此时应用服务器 1 的 tomcat 已全部启动,那么也意味着应用服务器 2 的第二台 tomcat 启动后,process 的值已超过 300(198+120=318),所以当再启动应用服务器 2 的第 3 台 tomcat 时就无法登录了,所以我们仅需要修改 process 和 session 的最大值即可,修改语句如下:
alter system set processes=1000 scope=spfile;
alter system set sessions=1105 scope=spfile;
注意一下 processes 的值和 sessions 的值,Oracle 官方文档中要求:
sessions=processes*1.5+5
也就是说 sessions 的值是根据 processes 的值计算后得到的,这里需要注意一下,最后重启一下 Oracle 服务即可,此时再分别开启应用服务器 2 的 3 个 tomcat 并依次访问主页后再看一下 process 和 session 的参数值和占用值情况:
如上图,可以看到 process 的值已经成功修改为 1000,而此时开启了 6 个 tomcat 所占用的 process 值为 378,session 的占用值为 375,都远远小于参数值,所以至此项目均已可以正常访问。
总结
简单记录一下这个 Oracle 异常的解决方案,希望对遇到同样问题的朋友有所帮助,The End。
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-09/135546.htm