我有一个在 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。没运气。
任何建议或帮助将不胜感激。