您的位置:首页 > 其它

使用阿里巴巴数据源和log4j注意的事项

2018-03-08 11:00 344 查看
这个也是一个小知识。之前我发过一个资源空白maven web项目,直接写业务代码即可。本来以为有了这个模板,以后直接写业务代码就行了。但是我使用这个模板做了两个不同的应用部署在同一台TOMCAT下面,发现一个应用可以使用,另外一个却不可以。也就是说这两个应用,如果单独部署的时候都可以使用,但是部署在一起的时候,只能使用其中一个,我就感觉到应该是相互影响。

使用阿里巴巴数据源出现的问题

一开始,我以为是这两个项目的spring-mybatis.xml文件中bean  id的值一样引起的,例如下面的代码: <bean id="dataSource" class="com.aotain.time.datasource.RoutingDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="timeManageDataSource" key="timeManage"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="timeManageDataSource"></property>
</bean> 然后我就将这些名字改成不一样的,结果还是不行。
后来我通过先部署一个,再部署另外一个,然后去查看tomcat日志的方式,发现了一下错误信息:javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidDataSourceStat
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.exclusiveUnregisterMBean(DefaultMBeanServerInterceptor.java:427)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.unregisterMBean(DefaultMBeanServerInterceptor.java:415)
at com.sun.jmx.mbeanserver.JmxMBeanServer.unregisterMBean(JmxMBeanServer.java:546)
at com.alibaba.druid.stat.DruidDataSourceStatManager.removeDataSource(DruidDataSourceStatManager.java:200)
at com.alibaba.druid.pool.DruidDataSource$2.run(DruidDataSource.java:1396)
at java.security.AccessController.doPrivileged(Native Method)
at com.alibaba.druid.pool.DruidDataSource.unregisterMbean(DruidDataSource.java:1392)
at com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:1353)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:350)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:273)
at org.springframework.beans.factory.support.DefaultSi
b6c4
ngletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:900)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:907)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:908)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:884)
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:836)
at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:579)
at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:115)
at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5156)
at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5829)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:221)
at org.apache.catalina.core.ContainerBase$StopChild.call(ContainerBase.java:1716)
at org.apache.catalina.core.ContainerBase$StopChild.call(ContainerBase.java:1705)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
[CONSOLE] 2018-03-07 10:47:58,881 ERROR com.alibaba.druid.stat.DruidStatService - unregister mbean error
javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidStatService
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.exclusiveUnregisterMBean(DefaultMBeanServerInterceptor.java:427)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.unregisterMBean(DefaultMBeanServerInterceptor.java:415)
at com.sun.jmx.mbeanserver.JmxMBeanServer.unregisterMBean(JmxMBeanServer.java:546)
at com.alibaba.druid.stat.DruidStatService.unregisterMBean(DruidStatService.java:366)
at com.alibaba.druid.stat.DruidDataSourceStatManager.removeDataSource(DruidDataSourceStatManager.java:205)
at com.alibaba.druid.pool.DruidDataSource$2.run(DruidDataSource.java:1396)
at java.security.AccessController.doPrivileged(Native Method)
at com.alibaba.druid.pool.DruidDataSource.unregisterMbean(DruidDataSource.java:1392)
at com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:1353)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:350)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:273)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:900)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:907)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:908)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:884)
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:836)
at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:579)
at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:115)
at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5156)
at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5829)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:221)
at org.apache.catalina.core.ContainerBase$StopChild.call(ContainerBase.java:1716)
at org.apache.catalina.core.ContainerBase$StopChild.call(ContainerBase.java:1705)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
后来我参考这边文章解决ERROR - unregister mbean error javax.management.InstanceNotFoundException: com.alibaba.druid:type=   修改tomcat的bin目录下的catalina.sh文件,在# OS specific support.  $var _must_ be set to either true or false.与cygwin=false之间加上JAVA_OPTS="-Ddruid.registerToSysProperty=true"就OK了

使用log4j还有个小的注意事项:

首先,如果对log4j不是很了解的话可以查看log4j.properties配置详解与实例
然后在web.xml中配置
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>Application</param-value>
</context-param>

<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:conf/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>10000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
当然也要导入对应的jar包,手动加入或者添加pom.xml都可以<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>在log4j配置的时候,读取的是wbe.xml里webAppRootKey属性下的值,而不是webAppRootKey。这个要是太久不用的话可能会忘记。
比如:### 系统成功日志 ###
log4j.appender.SUCCESS = org.apache.log4j.DailyRollingFileAppender
log4j.appender.SUCCESS.File = ${Application}/logs/success/success
log4j.appender.SUCCESS.Append = true
log4j.appender.SUCCESS.Threshold = INFO
log4j.appender.SUCCESS.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.SUCCESS.layout = org.apache.log4j.PatternLayout
log4j.appender.SUCCESS.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t ] %m%n还有个注意事项,同一个tomcat下的的两个应用,webAppRootKey属性下的值最好不要相同,因为这可能会导致这个应用的日志打印到另外一个应用log目录下(大家有空的时候可以自我探究下)。
OK,都讲完了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: