在停止服务器或在服务器上重新部署应用程序时,我在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。没有运气。
非常感谢任何建议或帮助。