diff --git a/AssetManager.Data/Repositories/MarketDataRepository.cs b/AssetManager.Data/Repositories/MarketDataRepository.cs index 2a7feed..63fdeae 100644 --- a/AssetManager.Data/Repositories/MarketDataRepository.cs +++ b/AssetManager.Data/Repositories/MarketDataRepository.cs @@ -54,7 +54,11 @@ public class MarketDataRepository : IMarketDataRepository public async Task SavePriceCacheAsync(MarketPriceCache cache) { cache.Id = GenerateCacheKey(cache.Symbol, cache.AssetType); - var result = await _db.Storageable(cache).ExecuteCommandAsync(); + + // 使用新的 SqlSugarClient 实例,避免并发写入时连接冲突 + // 连接池会复用底层连接,性能开销很小 + using var db = SqlSugarConfig.GetSqlSugarClient(); + var result = await db.Storageable(cache).ExecuteCommandAsync(); return result > 0; } diff --git a/AssetManager.Infrastructure/Services/MarketDataService.cs b/AssetManager.Infrastructure/Services/MarketDataService.cs index 2a15689..54966d4 100755 --- a/AssetManager.Infrastructure/Services/MarketDataService.cs +++ b/AssetManager.Infrastructure/Services/MarketDataService.cs @@ -22,14 +22,11 @@ public class MarketDataService : IMarketDataService private readonly IOkxMarketService _okxService; private readonly IMarketDataRepository _marketDataRepo; - // 静态内存缓存层(跨请求共享,避免并发数据库查询导致连接池冲突) + // 静态内存缓存层(跨请求共享) private static readonly ConcurrentDictionary _memoryCache = new(); // 静态 pending 请求字典(跨请求共享,防止并发请求同一股票) private static readonly ConcurrentDictionary>> _pendingPriceRequests = new(); - - // 静态写入锁(串行化数据库写入) - private static readonly SemaphoreSlim _writeLock = new(1, 1); public MarketDataService( ILogger logger, @@ -203,10 +200,10 @@ public class MarketDataService : IMarketDataService ExpiredAt = expireAt }, expireAt); - // 写入数据库缓存(串行化,避免连接冲突) + // 写入数据库缓存(后台执行,失败不影响主流程) + // SavePriceCacheAsync 每次创建新的 SqlSugarClient 实例,避免连接冲突 _ = Task.Run(async () => { - await _writeLock.WaitAsync(); try { await SavePriceCacheAsync(symbol, assetType, response, source); @@ -215,10 +212,6 @@ public class MarketDataService : IMarketDataService { _logger.LogWarning(ex, "[数据库缓存写入失败] Symbol={Symbol},忽略(内存缓存已生效)", symbol); } - finally - { - _writeLock.Release(); - } }); return response;