Tomcat内存泄漏警告 - AS400作业线程在关闭/重新部署时未关闭

时间:2016-07-25 14:40:34

标签: java spring tomcat ibm-midrange jt400

在停止服务器或在服务器上重新部署应用程序时,我在Tomcat 8.0服务器上运行Spring应用程序时出现以下错误。

INFO: Closing Spring root WebApplicationContext
Jul 25, 2016 10:18:40 AM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
WARNING: The web application [APP_NAME] appears to have started a thread named [AS400 Read Daemon [system:*connectionurl*;job:768339/QUSER/QZDASOINIT]] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.net.SocketInputStream.socketRead0(Native Method)
 java.net.SocketInputStream.socketRead(Unknown Source)
 java.net.SocketInputStream.read(Unknown Source)
 java.net.SocketInputStream.read(Unknown Source)
 com.ibm.as400.access.DataStream.readFromStream(DataStream.java:52)
 com.ibm.as400.access.ClientAccessDataStream.construct(ClientAccessDataStream.java:58)
 com.ibm.as400.access.AS400ThreadedServer.run(AS400ThreadedServer.java:357)
 java.lang.Thread.run(Unknown Source)

我正在连接到具有JT400 maven依赖关系的AS400数据库(版本9.0,虽然我已经尝试过其他人),所以AS400JDBCDriver。以下是我在app的context.xml中设置连接的方法

  <Resource name="jdbc/test_name"  
auth="Container" 
driverClassName="com.ibm.as400.access.AS400JDBCDriver" 
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
initialSize="3" 
logAbandoned="true" 
maxActive="100" 
maxIdle="40" 
maxWait="30000" 
minEvictableIdleTimeMillis="60000" 
minIdle="10" 
password="*password*" 
removeAbandoned="true" 
removeAbandonedTimeout="60" 
testOnBorrow="true" 
testOnReturn="false" 
testWhileIdle="true" 
timeBetweenEvictionRunsMillis="30000" 
type="javax.sql.DataSource" 
url="jdbc:as400:*connection url*;date format=iso;time format=iso;" 
username="*username*" 
validationInterval="30000" 
validationQuery="SELECT current date FROM sysibm.sysdummy1"
/>

然后在spring配置文件中声明数据源:

  <bean id="dataSourceTester" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName" value="java:comp/env/jdbc/test_name"/>
  </bean>

然后我使用该数据源有数十个bean。

  <bean id="testTesterDAO" class="*class  url*" scope="request">
<property name="dataSource" ref="dataSourceTester" />

所以问题是,当我停止我的Tomcat或重新部署时,我会收到许多关于未能停止的线程的消息。我知道它特别来自这个连接源,因为当我更改“initialSize”属性(例如从3到5)时,我会在服务器停止时收到很多消息。所以很明显,连接池打开的所有这些连接都没有被终止。

当服务器关闭时,线程会消失(显然,服务器不再存在),但是当它只是重新部署时,这些线程肯定会保持打开状态。我知道这是因为我可以使用as400机器找到开放式工作,但他们似乎并没有真正超时。

我已经尝试了很多东西,我有一个ServletContextListener来取消注册驱动程序(除去 警告,但不是这些),我试过将jt400.jar移动到tomcat / lib文件夹(但是当我运行它时,我无法确定它是否在那里工作),我已经尝试调整设置并尝试不同版本的jt400.jar。没有运气。

非常感谢任何建议或帮助。

0 个答案:

没有答案