溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么解決數(shù)據(jù)庫的Druid register mbean error的問題

發(fā)布時間:2021-11-19 13:06:23 來源:億速云 閱讀:304 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“怎么解決數(shù)據(jù)庫的Druid register mbean error的問題”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么解決數(shù)據(jù)庫的Druid register mbean error的問題”吧!

key: [com.alibaba.druid.stat.DruidDataSourceStatManager.addDataSource(DruidDataSourceStatManager.java:154)]  register mbean error

在使用數(shù)據(jù)庫連接池時(本文通用于其他使用jmx mbean的應(yīng)用),運(yùn)行幾天后出現(xiàn)如下錯誤

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) //這里入口

怎么解決數(shù)據(jù)庫的Druid register mbean error的問題

一路跟蹤源碼,傳入的參數(shù)一直是name屬性,查看上層 DruidDataSourceStatManager.java  addDataSource(Object dataSource, String name) 

怎么解決數(shù)據(jù)庫的Druid register mbean error的問題

在看上層: DruidDataSource.java line:1298

怎么解決數(shù)據(jù)庫的Druid register mbean error的問題

這里傳入了數(shù)據(jù)源的name屬性,經(jīng)過上面的分析,是利用DataSource的name屬性拼接成一個id,然后用次id注冊mbean, 然而,druid的name屬性寫成了一個默認(rèn)值

怎么解決數(shù)據(jù)庫的Druid register mbean error的問題

故此注冊失敗。

現(xiàn)在知道了原因,為什么運(yùn)行幾天后才出現(xiàn)這個錯誤,并且運(yùn)維說有回滾到了上個版本,在部署(直接重新部署,并沒有重啟tomcat/jvm)的時候就直接報這個錯誤,經(jīng)過上面的推斷是jvm中已經(jīng)有一個此id的mbean了,故此即使重新部署還是失敗,我給想了個辦法,重啟tomcat,搞定,果然奏效。

在來看看druid的wiki中,雖然提示了配置name屬性,但是在配置文件中配置后是不起作用的,經(jīng)過查看源碼發(fā)現(xiàn)并沒有加載次屬性,所以配置了沒用,后來我在代碼中獲取配置文件的name屬性,然后dataSource.setName(name),雖然名字設(shè)置成功了,在druid的監(jiān)控頁面也可以看的自定義的名字,但是不幸的是druid運(yùn)行幾天出錯了或者重新部署,然后重新向jvm注冊mbean,導(dǎo)致了出錯。

再來看看datasource的name的默認(rèn)值是怎么設(shè)置的DruidAbstractDataSource.java line: 849

怎么解決數(shù)據(jù)庫的Druid register mbean error的問題

可以看到在getName屬性中是DataSource-加上計算的一個hash值,但是此方法只在getName時返回,而在注冊mbean時druid的name默認(rèn)是null, 在注冊mbean時分析下面的代碼DruidDataSourceStatManager.java line: 161

怎么解決數(shù)據(jù)庫的Druid register mbean error的問題

代碼顯示是根據(jù)dataSource計算出來莪一個hash值,然后進(jìn)行注冊mbean。

經(jīng)過上面的分析在注冊mbean時,一定要保證registerMBean的name參數(shù)唯一,還要在上層攔截異常

InstanceAlreadyExistsException,然后自動處理異常

感謝各位的閱讀,以上就是“怎么解決數(shù)據(jù)庫的Druid register mbean error的問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對怎么解決數(shù)據(jù)庫的Druid register mbean error的問題這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI