新版SpringBoot集成sharding-jdbc報shardingsphere.shardingjdbc.jdbc.unsupported.AbstractUnsupportedOperationConnection.isValid解決方案


新版集成`sharding-jdbc`時報`SQLFeatureNotSupportedException`異常,該異常的意思是功能不支持的意思,就是`sharding-jdbc`沒有完全實現Datasouce接口規范導致功能不足。

2022-04-01 23:23:33.383  WARN 15396 --- [nio-8080-exec-6] o.s.b.a.jdbc.DataSourceHealthIndicator   : DataSource health check failed

org.springframework.dao.InvalidDataAccessApiUsageException: ConnectionCallback; isValid; nested exception is java.sql.SQLFeatureNotSupportedException: isValid
    at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:96)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
    ...
Caused by: java.sql.SQLFeatureNotSupportedException: isValid
    at org.apache.shardingsphere.shardingjdbc.jdbc.unsupported.AbstractUnsupportedOperationConnection.isValid(AbstractUnsupportedOperationConnection.java:157)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...

如果是較老一點的Spring可以參考spring boot 集成 sharding jdbc 分庫分表 踩坑_taopenglove的博客-CSDN博客文章進行配置,但是較新版本(2.6.6左右)不支持該方案,但是參考該文章設置的 DataSourceHealthContributorAutoConfiguration ,可以看出最后是根據數據源去拿 DataSourcePoolMetadata 然后進行健康檢查。

並且由於 ShardingDataSource 內部是封裝了真實數據源的,所以 ShardingDataSource 本身並不需要進行健康檢查,遇到 ShardingDataSource 的情況返回 null 即可(當然如果能全部實現是最好的)。

代碼如下

@Configuration
public class JpaConfiguration {
    /**
     * 解決新版Spring中,健康健康檢查用到 sharding jdbc 時,該組件沒有完全實現MySQL驅動導致的問題.
     */
    @Bean
    DataSourcePoolMetadataProvider dataSourcePoolMetadataProvider() {
        return dataSource -> dataSource instanceof HikariDataSource
// 這里如果所使用的數據源沒有對應的 DataSourcePoolMetadata 實現的話也可以全部使用 NotAvailableDataSourcePoolMetadata
? new HikariDataSourcePoolMetadata((HikariDataSource) dataSource) : new NotAvailableDataSourcePoolMetadata(); } /** * 不可用的數據源池元數據. */ private static class NotAvailableDataSourcePoolMetadata implements DataSourcePoolMetadata { @Override public Float getUsage() { return null; } @Override public Integer getActive() { return null; } @Override public Integer getMax() { return null; } @Override public Integer getMin() { return null; } @Override public String getValidationQuery() { // 該字符串是適用於MySQL的簡單查詢語句,用於檢查檢查,其他數據庫可能需要更換 return "select 1"; } @Override public Boolean getDefaultAutoCommit() { return null; } } }

 


免責聲明!

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



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