From e78d560f60628ff954f8a349e9630a793be1e9a4 Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Tue, 24 Mar 2026 10:33:37 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=95=B0=E6=8D=AE=E5=BA=93=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=86=99=E5=85=A5=E6=94=B9=E4=B8=BA=20Fire-and-Forget?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - 多个股票并发写入数据库缓存 - ISqlSugarClient 是 Singleton,共享连接 - Storageable.ExecuteCommandAsync 并发时连接冲突 修复: 1. 先写入内存缓存(确保返回给调用者) 2. 数据库缓存写入改为 Task.Run(Fire-and-Forget) 3. 写入失败只记录日志,不影响主流程 优先级:内存缓存 > 数据库缓存 - 内存缓存:必须成功,直接影响用户体验 - 数据库缓存:可选,失败后下次重新获取 --- .../Services/MarketDataService.cs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/AssetManager.Infrastructure/Services/MarketDataService.cs b/AssetManager.Infrastructure/Services/MarketDataService.cs index 5231d0c..7e03aa2 100755 --- a/AssetManager.Infrastructure/Services/MarketDataService.cs +++ b/AssetManager.Infrastructure/Services/MarketDataService.cs @@ -187,10 +187,7 @@ public class MarketDataService : IMarketDataService throw new InvalidOperationException($"获取到的价格无效: {symbol} = {response.Price}"); } - // 写入数据库缓存 - await SavePriceCacheAsync(symbol, assetType, response, source); - - // 同时写入内存缓存(5分钟有效) + // 先写入内存缓存(确保返回给调用者) var cacheKey = $"{symbol.ToUpper()}_{assetType.ToUpper()}"; var expireAt = DateTime.Now.AddMinutes(5); _memoryCache[cacheKey] = (new MarketPriceCache @@ -203,6 +200,19 @@ public class MarketDataService : IMarketDataService ExpiredAt = expireAt }, expireAt); + // 写入数据库缓存(Fire-and-Forget,失败不影响主流程) + _ = Task.Run(async () => + { + try + { + await SavePriceCacheAsync(symbol, assetType, response, source); + } + catch (Exception ex) + { + _logger.LogWarning(ex, "[数据库缓存写入失败] Symbol={Symbol},忽略(内存缓存已生效)", symbol); + } + }); + return response; }