手机APP长时间不使用,再次登录时出现登录失败,关掉进程再次登录则成功,系统后台出现
java.sql.SQLException: Already closed.
at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:114) at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:191) at org.springframework.jdbc.datasource.DataSourceUtils.doCloseConnection(DataSourceUtils.java:341) at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:328) at org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(DataSourceUtils.java:294) at org.mybatis.spring.transaction.SpringManagedTransaction.close(SpringManagedTransaction.java:127)
问题原因:长时间不用,数据库连接关闭,但是在应用中的数据库连接池还存在连接,失效连接未回收则会使用失效的连接,就会出现
connection reset 的问题。参考 博文:https://blog.csdn.net/soberchina/article/details/72953996#
问题处理:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<!--initialSize: 初始化连接-->
<property name="initialSize" value="15"/>
<!--maxIdle: 最大空闲连接-->
<property name="maxIdle" value="10"/>
<!--minIdle: 最小空闲连接-->
<property name="minIdle" value="5"/>
<!--maxActive: 最大连接数量-->
<property name="maxActive" value="100"/>
<!--------------------华丽分割线--------------------------->
<!--以上均为JDBC的默认配置,下面的配置是需要针对系统增加的属性配置-->
<!--removeAbandoned: 是否自动回收超时连接-->
<property name="removeAbandoned" value="true"/>
<!--removeAbandonedTimeout: 超时时间(以秒数为单位)-->
<property name="removeAbandonedTimeout" value="180"/>
<!--maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒-->
<property name="maxWait" value="30000"/>
<property name="poolPreparedStatements" value="false"/>
<property name="defaultAutoCommit" value="true"/>
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="true" />
<property name="validationQuery">
<value>SELECT 1 FROM DUAL</value>
</property>
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<property name="minEvictableIdleTimeMillis" value="1800000"/>
<property name="numTestsPerEvictionRun" value="10"/>
</bean>
对应的源码分析 org.apache.commons.dbcp.BasicDataSource
<!--removeAbandoned: 是否自动回收超时连接-->
<property name="removeAbandoned" value="true"/>
<!--removeAbandonedTimeout: 超时时间(以秒数为单位)-->
<property name="removeAbandonedTimeout" value="180"/>
<property name="defaultAutoCommit" value="false" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="true" />
<property name="testWhileIdle" value="true" />
<!--validationQuery:SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定, 则查询必须是一个SQL SELECT并且必须返回至少一行记录 -->
<property name="validationQuery">
<value>SELECT 1 FROM DUAL</value>
</property>
此处是对连接oracle数据进行的修改,不同的数据库对应的validationQuery的 value 值不同。