• 新版SpringBoot集成shardingjdbc报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; } } }
  • 相关阅读:
    CSS 3中细线边框如何实现?
    【SPL标准库专题(1)】 SPL简介
    【PSR规范专题(5)】PSR-4 改进后的自动加载规范
    【PSR规范专题(4)】PSR-3 日志接口规范
    【PSR规范专题(3)】PSR-2 代码风格规范
    【PSR规范专题(2)】PSR-1 基本代码规范
    YII框架的依赖注入容器与服务定位器简述
    PHP 反射机制Reflection
    【Apache运维基础(5)】Apache的Rewrite攻略(2)
    【Apache运维基础(4)】Apache的Rewrite攻略(1)
  • 原文地址:https://www.cnblogs.com/laeni/p/16089788.html
Copyright © 2020-2023  润新知