JBOSS4作为windows服务关闭时不断开数据库连接问题分析
问题现象:
现场发现,每次重启媒资服务,Oracle的数据库连接会增加约20个的JDBC连接.这样就会导致数据库连接越来越多.
问题分析
接到这个问题, 使用
这个SQL语句查询到 确实每次重启都有 大约20个 名为'JDBC Thin Client’
的数据库连接没有释放.
- 于是,想办法给JDBC的连接加上了名字. 具体办法是:修改
Oracle-DS.xml
增加一行配置1<connection-property name="v$session.program">DCMP DB Connection</connection-property>
这样就可以给我们的服务的数据库连接增加名字.
通过给
DCMP
与统计服务
增加名字. 并不断的重启服务器发现.这个问题是概率性的,并且大概率发生在统计服务上.通过分析启动的日志,发现当我们停止服务器的时候,日志中并没有出现停止服务应该有的一些shutdown的日志.而是硬生生的就停止服务了. 通过对比 使用Windows服务启停统计与使用run.bat批处理启停统计. 发现, 问题的根源在于我们注册的Windows服务上.使用run.bat命令行启停统计,一切正常, 在日志中会出现一系列的shutdown日志.
既然是JBoss Windows服务出现的问题,那么分析 相关的几个配置.
service.bat
修改这个配置,让shutdown事件打印出日志.发现当windows服务调用JBOSS的shutdown的时候,会报错:"Shutting down MAMSpace_DCMP_Service [2015-04-10 19:27:10] 系统找不到指定的路径"
那么问题就肯定在于JBOSS的 shutdown命令的问题了. 分析 JBOSS
shutdown.bat
发现其中的JAVA_HOME 没有修改过 指向的是默认的:“C:\Program Files (x86)\Java\jdk1.5.0_17”
我们的java并没有安装在那个地方.修改为正确的”..\jre”
. 再次启停.停止日志报错:
“java.lang.NoClassDefFoundError: org/jboss/system/server/ServerImplMBean at org.jboss.Shutdown.main(Shutdown.java:116)”
经过网上的查询分析.发现是JBOSS4的一个BUG.https://issues.jboss.org/browse/JBAS-3894 这个问题在JBOSS5中被修正.
但是由于我们不能更新JBOSS版本,只有想其他的办法,经过分析JBOSS的相关源码.他缺少的是一个
jbossall-client.jar
的依赖.于是从网上找到一个这个jar包.放入JBOSS/client/jbossall-client.jar
. 然后再次启停.发现报错:
Failed to connect to server localhost:1099
基本上能发现问题了. 是因为统计服务的默认1099
端口被改成了21099
.
因此需要修改shutdown.bat调用的时候的 默认端口. 经过分析,发现调用shutdown.bat的地方是在service.bat中. 默认传参是shutdown -S
修改成shutdown -s 127.0.0.1:21099
后. 再次实现. 问题解决
问题总结
要解决这个问题,主要需要有以下的几个步骤:
修改
"JBOSS\bin\shutdown.bat"
文件,把 JAVA_HOME 修改为"..\jre"
“set JAVA_HOME=..\jre”拷贝
jbossall-client.jar
到JBOSS/client/jbossall-client.jar
修改
service.bat
中的命令为默认端口. 这个端口号在"JBOSS/server/default/conf/jboss-service.xml"
文件中的123<mbean code="org.jboss.naming.NamingService"name="jboss:service=Naming"xmbean-dd="resource:xmdesc/NamingService-xmbean.xml">
节点下.call shutdown -s 127.0.0.1:21099
问题解决