springboot The last packet successfully received from the server was...

場景:
springboot項目,一段時間就報錯,The last packet successfully received from the server was...,提示連接失效。修改過數(shù)據(jù)源配置、有效性檢查、數(shù)據(jù)庫配置,依舊出現(xiàn)問題。

原因:
查看springboot啟動日志,發(fā)現(xiàn)提示:testWhileIdle is true, validationQuery not set
說明連接有效性檢查是開啟的,但是檢查所需要的語句沒有設(shè)置。
但是在springboot配置文件中是有設(shè)置的:

##########################  druid配置   ##########################
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置獲取連接等待超時的時間
spring.datasource.maxWait=60000
# 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
# 校驗SQL,Oracle配置 spring.datasource.validationQuery=SELECT 1 FROM DUAL,如果不配validationQuery項,則下面三項配置無用
spring.datasource.validationQuery=SELECT 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 打開PSCache,并且指定每個連接上PSCache的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻
spring.datasource.filters=stat,wall,log4j
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多個DruidDataSource的監(jiān)控數(shù)據(jù)
spring.datasource.useGlobalDataSourceStat=true

也就是說,springboot啟動注入出現(xiàn)問題了。

解決方式:

  1. 首先判斷是否配置問題,之前開發(fā)過很多springboot的項目,沒有遇到過類似的問題,分析和舊項目的區(qū)別:引入druid
  2. 分析是否druid的問題,查閱資料后沒有得到結(jié)果,從google分享配置上看沒有問題
  3. 分析是否springboot注入問題,查閱資料后發(fā)現(xiàn),springboot1.4后取消了spring.datasource.type注入,得到答案,注入要自己寫配置類
  4. 實現(xiàn)配置類
@Configuration

public class DruidConfiguration {

    @Value("${spring.datasource.url}")

    private String dbUrl;

    @Value("${spring.datasource.username}")

    private String username;

    @Value("${spring.datasource.password}")

    private String password;

    @Value("${spring.datasource.driver-class-name}")

    private String driverClassName;

    @Value("${spring.datasource.initialSize}")

    private int initialSize;

    @Value("${spring.datasource.minIdle}")

    private int minIdle;

    @Value("${spring.datasource.maxActive}")

    private int maxActive;

    @Value("${spring.datasource.maxWait}")

    private int maxWait;

    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")

    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.minEvictableIdleTimeMillis}")

    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.validationQuery}")

    private String validationQuery;

    @Value("${spring.datasource.testWhileIdle}")

    private boolean testWhileIdle;

    @Value("${spring.datasource.testOnBorrow}")

    private boolean testOnBorrow;

    @Value("${spring.datasource.testOnReturn}")

    private boolean testOnReturn;

    @Value("${spring.datasource.poolPreparedStatements}")

    private boolean poolPreparedStatements;

    @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")

    private int maxPoolPreparedStatementPerConnectionSize;

    @Value("${spring.datasource.filters}")

    private String filters;

    @Value("${spring.datasource.connectionProperties}")

    private String connectionProperties;

    @Value("${spring.datasource.useGlobalDataSourceStat}")

    private boolean useGlobalDataSourceStat;



    @Bean     //聲明其為Bean實例

    @Primary  //在同樣的DataSource中,首先使用被標(biāo)注的DataSource

    public DataSource dataSource(){

        DruidDataSource datasource = new DruidDataSource();

        datasource.setUrl(this.dbUrl);

        datasource.setUsername(username);

        datasource.setPassword(password);

        datasource.setDriverClassName(driverClassName);



        //configuration

        datasource.setInitialSize(initialSize);

        datasource.setMinIdle(minIdle);

        datasource.setMaxActive(maxActive);

        datasource.setMaxWait(maxWait);

        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);

        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);

        datasource.setValidationQuery(validationQuery);

        datasource.setTestWhileIdle(testWhileIdle);

        datasource.setTestOnBorrow(testOnBorrow);

        datasource.setTestOnReturn(testOnReturn);

        datasource.setPoolPreparedStatements(poolPreparedStatements);

        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);

        datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);

        try {

            datasource.setFilters(filters);

        } catch (SQLException e) {

            System.err.println("druid configuration initialization filter: "+ e);

        }

        datasource.setConnectionProperties(connectionProperties);

        return datasource;

    }

}

再次啟動正常,運行一段時間后無超時現(xiàn)象,說明連接有效性檢查生效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容