Skip to content

ShardingRuntimeBuilder方式导致内存溢出 #304

Open

Description

@TanShuJun1985

我无法在 Startup.cs中使用,因为我的ApplicationDbContext必须在服务器启动完成后再注册的:
services.AddDbContext《ApplicationDbContext>((sp, b) =>
{
var tenantManager = sp.GetRequiredService《ITenantManager>();
if (shardingRuntimeContext!= null)
{
b.UseDefaultSharding《ApplicationDbContext>(shardingRuntimeContext);
}
});
以上代码我无法在 Startup.cs中使用,也就是在服务器启动期间。

所以我在使用ShardingRuntimeBuilder方式,并在ApplicationDbContext的OnConfiguring方法里来实现optionsBuilder.UseDefaultSharding(),但是会出现OnConfiguring方法被无限循环调用,导致内存溢出:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (shardingRuntimeContext != null)
        {
            optionsBuilder.UseDefaultSharding《ApplicationDbContext>(shardingRuntimeContext);
        }
        
        base.OnConfiguring(optionsBuilder);
    }

shardingRuntimeContext变量获取相关的代码这里已经删除省略

Activity

  1. TanShuJun1985 commented on May 31, 2026

    @TanShuJun1985
    Author

    经过堆栈分析,一直在 ShardingQueryCompiler.Execute -> DefaultShardingCompilerExecutor.Execute -> DefaultShardingTrackQueryExecutor.Execute 这3个方法中循环调用

  2. TanShuJun1985 commented on May 31, 2026

    @TanShuJun1985
    Author

    而在DefaultShardingCompilerExecutor. Execute当中 又执行了 var queryCompilerContext = _queryCompilerContextFactory.Create(prepareParseResult);
    导致再次调用 CreateDbContext() ,且一直循环

    public TResult Execute(IShardingDbContext shardingDbContext, Expression query)
    {
    var prepareParseResult = _prepareParser.Parse(shardingDbContext,query);
    _logger.LogDebug($"compile parameter:{prepareParseResult}");
    using (new CustomerQueryScope(prepareParseResult,_shardingRouteManager))
    {
    //这个地方又会调用CreateDbContext()
    var queryCompilerContext = _queryCompilerContextFactory.Create(prepareParseResult);
    return _shardingTrackQueryExecutor.Execute(queryCompilerContext);
    }

        }
    
  3. xuejmnet commented on May 31, 2026

    @xuejmnet
    Collaborator
  4. TanShuJun1985 commented on May 31, 2026

    @TanShuJun1985
    Author

    不要再dbcontext中的OnConfiguring使用defaultsharding,应该在构造dbcontext的构造函数前对options进行处理

    发自我的iPhone
    …

    但是如果不执行 optionsBuilder.UseDefaultSharding(shardingRuntimeContext); 分片不起作用啊,我是用的ShardingRuntimeBuilder方式

  5. TanShuJun1985 commented on May 31, 2026

    @TanShuJun1985
    Author

    不要再dbcontext中的OnConfiguring使用defaultsharding,应该在构造dbcontext的构造函数前对options进行处理

    发自我的iPhone
    …

    在构造dbcontext的构造函数前对options进行处理,那我用ShardingRuntimeBuilder就没有意义了啊,因为我的场景是插件化,DbContext的名称也是又插件决定的,在安装插件时才能注入DbContext

  6. xuejmnet commented on May 31, 2026

    @xuejmnet
    Collaborator

    @TanShuJun1985

    我不太懂你的意思,这样不行吗

    ShardingProvider.ShardingRuntimeContext.UseAutoTryCompensateTable();
    
    var dbContextOptionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
    dbContextOptionsBuilder.UseDefaultSharding<MyDbContext>(ShardingProvider.ShardingRuntimeContext);
    using (var dbcontext = new MyDbContext(dbContextOptionsBuilder.Options))

    源码的Sample.ShardingConsole不是有手动构建的方式吗

  7. TanShuJun1985 commented on May 31, 2026

    @TanShuJun1985
    Author

    @TanShuJun1985

    我不太懂你的意思,这样不行吗

    ShardingProvider.ShardingRuntimeContext.UseAutoTryCompensateTable();

    var dbContextOptionsBuilder = new DbContextOptionsBuilder();
    dbContextOptionsBuilder.UseDefaultSharding(ShardingProvider.ShardingRuntimeContext);
    using (var dbcontext = new MyDbContext(dbContextOptionsBuilder.Options))
    源码的Sample.ShardingConsole不是有手动构建的方式吗

    new MyDbContext()倒是可以用,只是不能用 Lamar 的[Scoped]注入方式感觉不方便,且可能存在效率问题

  8. xuejmnet commented on Jun 1, 2026

    @xuejmnet
    Collaborator

    @TanShuJun1985 没有啊,依赖注入框架无非是你new还是框架new又没有区别,哪怕是sharding-core内部也是dbContextOptionsBuilder.UseDefaultSharding<MyDbContext>(ShardingProvider.ShardingRuntimeContext); 所以没有任何区别,透过现象看本质

    Image
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions