Druid register mbean error
key: [com.alibaba.druid.stat.DruidDataSourceStatManager.addDataSource(DruidDataSourceStatManager.java:154)] register mbean error
在使用数据库连接池时(本文通用于其它使用jmx mbean的应用)。执行几天后出现例如以下错误
2014/11/18 10:31:00,617 [ERROR] [localhost-startStop-6] [com.alibaba.druid.stat.DruidDataSourceStatManager.addDataSource(DruidDataSourceStatManager.java:154)] register mbean error
javax.management.InstanceAlreadyExistsException: com.alibaba.druid:type=DruidDataSource,id=Druid MySQL DB pool
at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:453)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.internal_addObject(DefaultMBeanServerInterceptor.java:1484)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:963)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:917)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:312)
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:482)
at com.alibaba.druid.stat.DruidDataSourceStatManager.addDataSource(DruidDataSourceStatManager.java:152)
at com.alibaba.druid.pool.DruidDataSource$1.run(DruidDataSource.java:1298)
at java.security.AccessController.doPrivileged(Native Method)
at com.alibaba.druid.pool.DruidDataSource.registerMbean(DruidDataSource.java:1294)
at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:623)
at com.longdai.data.ConnectionManagerDruid.<init>(ConnectionManagerDruid.java:68)
at com.longdai.data.ConnectionManager.getInstance(ConnectionManager.java:86)
at com.longdai.data.dao.Database.<clinit>(Database.java:22)
at com.longdai.service.admin.CloseNetWorkService.getNetWorkById(CloseNetWorkService.java:87)
at com.longdai.service.admin.CloseNetWorkService$$FastClassByCGLIB$$bbdb465c.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at com.gozap.services.ServiceMethodInterceptor.invoke(ServiceMethodInterceptor.java:31)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
at com.longdai.service.admin.CloseNetWorkService$$EnhancerByCGLIB$$19cbebaf.getNetWorkById(<generated>)
at com.longdai.system.listener.CloseNetWorkConfigiListener.contextInitialized(CloseNetWorkConfigiListener.java:37)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4791)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:963)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1600)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
查看源代码,一直跟踪到
at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:453)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.internal_addObject(DefaultMBeanServerInterceptor.java:1484) // 这里
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:963)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:917)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:312) //这里入口
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFubW81NTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
一路跟踪源代码。传入的參数一直是name属性,查看上层 DruidDataSourceStatManager.java addDataSource(Object dataSource, String name)
在看上层: DruidDataSource.java line:1298
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFubW81NTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
这里传入了数据源的name属性。经过上面的分析,是利用DataSource的name属性拼接成一个id,然后用次id注冊mbean, 然而。druid的name属性写成了一个默认值
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFubW81NTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
故此注冊失败。
如今知道了原因,为什么执行几天后才出现这个错误,而且运维说有回滚到了上个版本号,在部署(直接又一次部署,并没有重新启动tomcat/jvm)的时候就直接报这个错误,经过上面的判断是jvm中已经有一个此id的mbean了,故此即使又一次部署还是失败,我给想了个办法,重新启动tomcat。搞定,果然奏效。
在来看看druid的wiki中,尽管提示了配置name属性,可是在配置文件里配置后是不起作用的。经过查看源代码发现并没有载入次属性,所以配置了没用。后来我在代码中获取配置文件的name属性。然后dataSource.setName(name)。尽管名字设置成功了,在druid的监控页面也能够看的自己定义的名字,可是不幸的是druid执行几天出错了或者又一次部署,然后又一次向jvm注冊mbean,导致了出错。
再来看看datasource的name的默认值是怎么设置的DruidAbstractDataSource.java line: 849
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFubW81NTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
能够看到在getName属性中是DataSource-加上计算的一个hash值,可是此方法仅仅在getName时返回,而在注冊mbean时druid的name默认是null, 在注冊mbean时分析以下的代码DruidDataSourceStatManager.java line: 161
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFubW81NTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
代码显示是依据dataSource计算出来莪一个hash值,然后进行注冊mbean。
经过上面的分析在注冊mbean时。一定要保证registerMBean的name參数唯一。还要在上层拦截异常
InstanceAlreadyExistsException。然后自己主动处理异常
总结:在使用Druid的时候。不要使用name属性,druid官网并没有给出说明,本文在此给大家一个解释和处理方法。另外1.0.5版本号配置后是不起作用的,须要自己强行setName。如自己配置了name,为防止出错。最好改动Druid源代码 DruidDataSourceStatManager.java addDataSource(Object
dataSource, String name) 。在生成objectName是在加一个 hash(參考161)。另外大家在注冊MBean时。一定要保证id的唯一,以及反复的处理方式。假设出现了这个错误,就将与本项目使用的同一个jvm的项目都关掉,清理掉本jvm,然后重新启动服务
Druid register mbean error的更多相关文章
- 解决ERROR - unregister mbean error javax.management.InstanceNotFoundException: com.alibaba.druid:type=
https://blog.csdn.net/chengsi101/article/details/72627062 https://www.cnblogs.com/gradven/p/6323195. ...
- 解决若依linux启动ERROR - unregister mbean error javax.management.InstanceNotFoundException: com.alibaba.druid:type=
项目中使用druid对数据库连接池进行管理,在本地及测试环境均无问题,但是上了生产环境后,每当tomcat第一次启动时,日志未报错,但是页面总是出不来,在关闭tomcat时,看日志,发现报错如下: E ...
- 一个Tomcat下部署多个项目异常:org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean 的解决方法
内容简介 在测试服务器上Tomcat下部署两个Spring boot项目,总是一个能启动成功,另一个启动不成功.这两个war包单独部署均能正常启动. 查看日志:启动时报出 org.springfram ...
- docker pull报错failed to register layer: Error processing tar file(exit status 1): open permission denied
近来在一个云主机上操作docker pull,报错如下: failed to register layer: Error processing ): open /etc/init.d/hwclock. ...
- [转]iMPACT Spartan-6 FPGA - "WARNING:iMPACT:2217-Error shows in the status register, CRC Error bit is Not 0"
AR# 45304 iMPACT Spartan-6 FPGA - "WARNING:iMPACT:2217-Error shows in the status register, CRC ...
- Unable to register MBean [HikariDataSource (HikariPool-0)] with key 'dataSou rce'; nested exception is javax.management.InstanceAlreadyExistsException: com.z axxer.hikari:name=dataSource,type=HikariDa
今天启动项目看到已经启动起来,但是看到控制台有红色,没注意是什么问题,具体在细看下,发现是一个Tomcat中发布了两个实例. 解决办法:去发布路径下,全部删掉或者删掉不用的即可.
- 报错: unable to register MBean
解决方法: 在SpringBoot项目中配置文件加上 spring.jmx.enabled=false https://stackoverflow.com/questions/27440985/una ...
- tomcat 重启报错unregister mbean error javax.management.InstanceNotFoundException
JAVA_OPTS='-Ddruid.registerToSysProperty=true' 多个应用部署到tomcat下需要在/bin/catalina.sh下添加上面这句话 添加位置在‘cygwi ...
- 宇视摄像机/NVR OCX插件插件安装出现:Failed to register ocx, error code 14001 错误的解决方法
最近在使用EasyNVR接入海康.宇视的摄像机进行景观直播的项目时,需要进入宇视设备进行音视频编码参数的调整,要说呢,海康的产品好就是要好很多: 海康的设备后台管理页面,不需要装插件也能进去,而且能调 ...
随机推荐
- MVC如何避免控制器方法接收到的值不能被转换为参数类型
假设控制器方法参数类型是int: public ActionResult GetSth(int id) { return Content(id.ToString()); } 而视图传递过来的是字符串: ...
- MVC自定义编辑视图,DateTime类型属性显示jQuery ui的datapicker
实现的效果为:在编辑视图中,对DateTime类型的属性,显示jQuery UI的datepicker.效果如下: Student.cs public class Student { ...
- [原] corePlot 类库与iOS自带类库使用方法对比(很多开源代码都有这个特点)
——人类最倚重的是自己的“以往经验”.—— 我们直接看一下在corePlot 类库和iOS自带类中为一个控件设置文本显示格式的实现. * corePlot 类库中,为一个对象设置标题显示格式 , ...
- Java发邮件带附件(且重命名附件)
环境:spring3.2.2+jquery 用户的附件管理要实现发送附件可以是单个也可以是多个.由于用户在上传附件的时候采用了重命名机制,所以存在服务器上的文件是重命名后的文件,如果用户要将文件以邮件 ...
- Mysql中与时间相关的统计分析
最近项目需要统计一段日期范围内,根据每分钟.几分钟.每天分别统计汇总某些事件/指标的发生总次数,平均发生次数,因此总结了Mysql中与时间处理.统计相关的资料. 按分钟统计某一时间段内的数据 SELE ...
- tomcat怎么运行servlet程序
新建一个web project 取名 myproject 在myproject 新建一个继承了HttpServlet 的类 MyServlet 重写HttpServlet 的 dopost doget ...
- Furure的简单介绍和使用
引子:
- ActiveMQ使用示例之Queue
我们使用ActiveMQ为大家实现一种点对点的消息模型. 开发时候,要将apache-activemq-5.12.0-bin.zip解压缩后里面的activemq-all-5.12.0.jar包加入到 ...
- OpenCV学习(28) 轮廓
OpenCV中可以方便的在一副图像中检测到轮廓,并把这些轮廓画出来.主要用到两个函数:一个是findContours( img, contours0, hierarchy, RETR_TREE, CH ...
- OTL翻译(5) -- otl_stream流相关绑定变量
声明绑定变量 本章节将详细的说明如何在otl_stream流里面声明绑定变量. SQL语句.SQL语句块或存储过程在程序里面使用的时候总是带有占位符.OTL里面带有一个小的解析器用来解析这些占位符,并 ...