atomikos + druid 連接超時失效


atomikos + druid 連接超時失效,需要多次連接才能成功。

首次連接會報異常:

2018-01-08 16:58:12 DEBUG [com.jpcar.model.dao.jpcar.AdminDao.getByName:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:145)] ==> Parameters: root(String)
2018-01-08 16:58:12 ERROR [com.alibaba.druid.pool.DruidPooledStatement:com.alibaba.druid.pool.DruidPooledStatement.errorCheck(DruidPooledStatement.java:296)] CommunicationsException, druid version 1.1.6, jdbcUrl : jdbc:mysql://localhost:3306/jpcar?serverTimezone=PRC&useSSL=false&useUnicode=true&characterEncoding=UTF8&autoReconnect=true, testWhileIdle true, idle millis 94276, minIdle 5, poolingCount 3, timeBetweenEvictionRunsMillis 8000, lastValidIdleMillis 94276, driver com.mysql.jdbc.Driver, exceptionSorter com.alibaba.druid.pool.vendor.MySqlExceptionSorter
2018-01-08 16:58:12 ERROR [com.alibaba.druid.pool.DruidDataSource:com.alibaba.druid.pool.DruidDataSource.handleFatalError(DruidDataSource.java:1594)] discard connection
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 91,089 milliseconds ago.  The last packet sent successfully to the server was 1 milliseconds ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3556)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3456)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3897)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2677)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2549)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
    at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1192)
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3051)
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440)
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049)

而 druid 連接池也配置了

<property name="validationQuery" value="SELECT 1" />
        <property name="timeBetweenEvictionRunsMillis" value="2800000" />
        <property name="minEvictableIdleTimeMillis" value="600000" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />

 

等數據庫的wait_timeout到時,依然會報錯,需要多次連接才成功。

 

解決:

在配置 AtomikosDataSourceBean 時 配上 連接檢查:

    <bean id="jpcarAtom" class="com.atomikos.jdbc.AtomikosDataSourceBean"
        init-method="init" destroy-method="close">
        <property name="uniqueResourceName" value="mysql/jpcar" />
        <property name="xaDataSource" ref="jpcar" />
        <property name="maintenanceInterval" value="28000" />
        <property name="testQuery" value="SELECT 1" />
    </bean>

具體解決方案

至於原理,不懂。瞎蒙到的。

估計是druid那邊的連接移除了,atomikos那還有緩存。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM