ShardingJdbc的连接池是放在哪里?

@Configuration
public class MyDataSourceConfiguration {

    @Resource
    private DynamicDataSourceProperties properties;

    @Lazy
    @Resource
    private Shardingdatasource shardingDataSource;

    @Bean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        return new AbstractDataSourceProvider() {

            @Override
            public Map<String, DataSource> loadDataSources() {
                Map<String, DataSource> dataSourceMap = new HashMap<>();
                dataSourceMap.put("sharding", shardingDataSource);
                //下面的代码可以把 shardingJdbc 内部管理的子数据源也同时添加到动态数据源里 (根据自己需要选择开启+注解了@Lazy被代理了不可以)
                Map<String, DataSource> shardingInnerDataSources = shardingDataSource.getDataSourceMap("");
                dataSourceMap.putAll(shardingInnerDataSources);
                return dataSourceMap;
            }
        };
    }

    /**
     * 将动态数据源设置为首选的
     * 当spring存在多个数据源时, 自动注入的是首选的对象
     * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了
     * 3.4.0版本及以上使用以下方式注入,老版本请阅读文档  进阶-手动注入多数据源
     */
    @Primary
    @Bean
    public DataSource dataSource() {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setPrimary(properties.getPrimary());
        dataSource.setStrict(properties.getStrict());
        dataSource.setStrategy(properties.getStrategy());
        dataSource.setP6spy(properties.getP6spy());
        dataSource.setSeata(properties.getSeata());
        return dataSource;
    }
}

我在以前版本是在Shardingdatasource管理,但现在似乎没有了。

类名变了. master分支的example有现成例子.

@泠恒谦 好像我在master分支上并没有找到 能提供下截图或者类名吗?

shardingSphereDataSource。我怀疑你这并不是ShardingSphere。你应该参考 dynamic-datasource-samples/third-part-samples/shardingSphere-jdbc-sample at master · dynamic-datasource/dynamic-datasource-samples · GitHub

你可能并没有尝试过,这样注入的是一个代理类,这样我并不能通过这个去需要sharding下有哪几个数据源。

这样注入的话 是无法成功的。

![image|690x319](upload://vf88bOxx5zvtYXbZp1yvfkK7cRG.png)

但是只能通过ShardingSphereDataSource去获取Sharding的数据源。所以目前我并没有找到方法去获取数据源,然后放到dynamic.datasource的多数据源里,进行数据源切换

  • ?你这发的什么图片
  • 我不知道你指的无法注入是什么,因为单元测试一切正常。你需要提供最小可复现demo

我不得不怀疑你正在使用SpringBoot OSS < 2.5.0的版本,从2.5.0开始JDBC数据源有了Order的概念以方便初始化,参考相关的Release Note 。使用一个停止维护的OSS版本在道义上应该寻求VMWare的商业支持。这是我在 整合sharding的时候,停止程序报错,和#395差不多 · Issue #415 · baomidou/dynamic-datasource-spring-boot-starter · GitHub 提到过的

此外,只是放置数据源的话,我不回复了 dynamic-datasource-samples/third-part-samples/shardingSphere-jdbc-sample at master · dynamic-datasource/dynamic-datasource-samples · GitHub 吗?

我需要拿到dataSourceMap1。如果向上转型注入的话,是无法把DataSource强转为ShardingSphereDataSource。因为你注入的是代理对象。

这涉及到一个有趣的问题,为什么需要这么做?我和dynamic datasource的作者都认为shardingsphere内部的数据源应该由它自己处理。dynamic datasource只应该处理ShardingSphere虚拟出的数据源。

  • 我必须指出ShardingSphere的数据源是可以动态增删改查的,这么做很考验用户。
  • 我才注意到我的example被另外的朋友改过,你可以查看git记录,就知道我指的是什么。

好吧 因为以前是可以的!需要这么做 是因为之前是通过dynamic datasource做的一些增删改查没法很快改成通过Sharding去做

现在也可以。直接通过@Resource注入ShardingSphereDataSource, 不需要注入DataSource。参考 dynamic-datasource-samples/MyDataSourceConfiguration.java at c00c3b0790fe11f78997495af64ee7a6c0f9284a · dynamic-datasource/dynamic-datasource-samples · GitHub ,这是我一向的观点,来自 针对ShardingSphere-JDBC 5.0.0的数据源Bean Class名字问题的解决方案

这样注入会有问题。会导致一些Sharding的配置未被初始化配置

对于final类来说是一种必然?

    rules:
      sharding:
        tables:
          tb_group_call_record_statistics:
            actualDataNodes: voice_record.tb_group_call_record_statistics_$->{20220608..20221231}
            table-strategy:
              standard:
                sharding-algorithm-name: default-date-algorithms
                sharding-column: statistics_date
        sharding-algorithms:
          default-date-algorithms:
            type: INTERVAL
            props:
              datetime-pattern: 'yyyy-MM-dd HH:mm:ss'
              datetime-lower: '2022-01-01 00:00:00'
              datetime-upper: '2030-12-01 00:00:00'
              sharding-suffix-pattern: 'yyyyMMdd'
              datetime-interval-amount: 1
              datetime-interval-unit: 'DAYS'

你可以用这个规则配置,加上你上面注入的方式。会导致props下的属性会set失败。必然

我无法复现。你能提供一个最小复现demo?

京ICP备2021015875号