You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
而在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);
}
------------------ 原始邮件 ------------------
发件人: TanShuJun1985 ***@***.***>
发送时间: 2026年5月31日 01:16
收件人: dotnetcore/sharding-core ***@***.***>
抄送: Subscribed ***@***.***>
主题: Re: [dotnetcore/sharding-core] ShardingRuntimeBuilder方式导致内存溢出 (Issue #304)
TanShuJun1985 created an issue (dotnetcore/sharding-core#304)
我无法在 Startup.cs中使用,因为我的ApplicationDbContext必须时服务器启动后再注册的:
services.AddDbContext((sp, b) =>
{
var tenantManager = sp.GetRequiredService();
if (currentTenantContext != null)
{
b.UseDefaultSharding(currentTenantContext);
}
});
以上代码我无法在 Startup.cs中使用,也就是在服务器启动期间。
所以我在使用ShardingRuntimeBuilder方式,并在ApplicationDbContext的OnConfiguring方法里来实现optionsBuilder.UseDefaultSharding(),但是会出现OnConfiguring方法被无限循环调用,导致内存溢出:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (shardingRuntimeContext != null) { optionsBuilder.UseDefaultSharding<ApplicationDbContext>(shardingRuntimeContext); } base.OnConfiguring(optionsBuilder); }
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: ***@***.***>
var dbContextOptionsBuilder = new DbContextOptionsBuilder();
dbContextOptionsBuilder.UseDefaultSharding(ShardingProvider.ShardingRuntimeContext);
using (var dbcontext = new MyDbContext(dbContextOptionsBuilder.Options))
源码的Sample.ShardingConsole不是有手动构建的方式吗
new MyDbContext()倒是可以用,只是不能用 Lamar 的[Scoped]注入方式感觉不方便,且可能存在效率问题
Activity
TanShuJun1985 commentedon May 31, 2026
经过堆栈分析,一直在 ShardingQueryCompiler.Execute -> DefaultShardingCompilerExecutor.Execute -> DefaultShardingTrackQueryExecutor.Execute 这3个方法中循环调用
TanShuJun1985 commentedon May 31, 2026
而在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);
}
xuejmnet commentedon May 31, 2026
TanShuJun1985 commentedon May 31, 2026
但是如果不执行 optionsBuilder.UseDefaultSharding(shardingRuntimeContext); 分片不起作用啊,我是用的ShardingRuntimeBuilder方式
TanShuJun1985 commentedon May 31, 2026
在构造dbcontext的构造函数前对options进行处理,那我用ShardingRuntimeBuilder就没有意义了啊,因为我的场景是插件化,DbContext的名称也是又插件决定的,在安装插件时才能注入DbContext
xuejmnet commentedon May 31, 2026
@TanShuJun1985
我不太懂你的意思,这样不行吗
源码的Sample.ShardingConsole不是有手动构建的方式吗
TanShuJun1985 commentedon May 31, 2026
new MyDbContext()倒是可以用,只是不能用 Lamar 的[Scoped]注入方式感觉不方便,且可能存在效率问题
xuejmnet commentedon Jun 1, 2026
@TanShuJun1985 没有啊,依赖注入框架无非是你new还是框架new又没有区别,哪怕是sharding-core内部也是
dbContextOptionsBuilder.UseDefaultSharding<MyDbContext>(ShardingProvider.ShardingRuntimeContext);所以没有任何区别,透过现象看本质