3

我有一个在 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 依赖项(版本 9.0,尽管我尝试过其他版本)连接到 AS400 db,所以使用 AS400JDBCDriver。这是我在应用程序的 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。没运气。

任何建议或帮助将不胜感激。

4

0 回答 0