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

这个也是一个小知识。之前我发过一个资源空白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.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)
[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,都讲完了。


猜你喜欢

转载自blog.csdn.net/qq_32574435/article/details/79480590