springmvc + jta+atomikos+druid 启动连接池泄露:bandon connection

springmvc + jta+atomikos+druid 启动报错om.alibaba.druid.pool.DruidDataSource.removeAbandoned(DruidDataSource.java:2298) abandon connection, owner thread: RMI TCP Connection(idle), connected at : 1689237106459, open stackTrace


<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
          init-method="init" destroy-method="close" primary="true">
        <property name="uniqueResourceName">
            <value>dataSourceOne</value>
        </property>
        <property name="xaDataSourceClassName" value="com.alibaba.druid.pool.xa.DruidXADataSource"/>
        <property name="poolSize" value="${ds.initialSize}" />
        <property name="minPoolSize" value="${ds.minIdle}"/>
        <property name="maxPoolSize" value="${ds.maxActive}"/>
        <property name="borrowConnectionTimeout" value="${ds.maxWait}"/>
        <property name="reapTimeout" value="60"/>
        <property name="maxIdleTime" value="300"/>
        <property name="maintenanceInterval" value="60"/>
        <property name="loginTimeout" value="60"/>
        <property name="xaProperties">
            <props>
                <!-- 基本属性 url、user、password -->
                <prop key="url"   >${jdbc.url}</prop>
                <prop key="username"   >${jdbc.username}</prop>
                <prop key="password" >${jdbc.password}</prop>

                <!-- 配置初始化大小、最小、最大 -->
                <prop key="initialSize"  >${ds.initialSize}</prop>
                <prop key="minIdle" >${ds.minIdle}</prop>
                <prop key="maxActive"  >${ds.maxActive}</prop>

                <!--超过时间限制是否回收-->
                <prop key="removeAbandoned" >true</prop>

                <!-- 超时时间;单位为秒。60秒 -->
                <prop key="removeAbandonedTimeout" >300</prop>

                <!-- 关闭abanded连接时输出错误日志 -->
                <prop key="logAbandoned" >true</prop>

                <!-- 配置获取连接等待超时的时间 -->
                <prop key="maxWait" >${ds.maxWait}</prop>

                <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
                <prop key="timeBetweenEvictionRunsMillis" >${ds.timeBetweenEvictionRunsMillis}</prop>

                <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
                <prop key="minEvictableIdleTimeMillis" >${ds.minEvictableIdleTimeMillis}</prop>



            </props>
        </property>

    </bean>

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
        <property name="forceShutdown">
            <value>true</value>
        </property>
    </bean>
    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
        <property name="transactionTimeout" value="300" />
    </bean>
    <bean id="springJTATransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager" ref="atomikosTransactionManager"/>
        <property name="userTransaction" ref="atomikosUserTransaction" />
        <property name="allowCustomIsolationLevels" value="true"/>
    </bean>


虽然打印的事error日志,但这也不是报错,如果是错误的话,项目应该启动不起来。
首先 你的配置开启了removeAbandoned 配置,该方法可以用于从连接池中移除闲置时间过长的连接。当连接池中的连接长时间处于空闲状态时,它们可能会被认为是废弃连接并被移除,这是个正常的操作。
其次 你的配置开启了logAbandoned配置,从源码可知,当进行释放的时候 会根据该配置判断是否打印日志,参考源码

com.alibaba.druid.pool.DruidDataSource#removeAbandoned

如果你不想有这个日志输出,可以吧logAbandoned配置关掉。
如果对你有帮助,麻烦点一个采纳,谢谢。如果有什么疑问可以随时提问~