PGSQL异步插入语句不会自动删除二级缓存 返回
【版本:5.1.4.126】配置开启自动删除缓存时:IsAutoRemoveDataCache = true 执行异步Insert时不会自动删除缓存,手动添加:.RemoveDataCache()后可生效,Update,Delete,Storageable测试正常
注:这个问题一直存在很久了,之前使用的同步模式,具体那个版本开始不记得了,今天有时间提一下
配置代码
var db = new SqlSugarClient(new ConnectionConfig() { DbType = DbType.PostgreSQL, ConnectionString = connStr, InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true, ConfigureExternalServices = new ConfigureExternalServices() { DataInfoCacheService = myCache //配置我们创建的缓存类 }, MoreSettings = new ConnMoreSettings() { PgSqlIsAutoToLower = true, //数据库存在大写字段的 ,需要把这个设为false ,并且实体和字段名称要一样 IsAutoRemoveDataCache = true //所有 增、删 、改 会自动调用.RemoveDataCache() ==>insert有bug【插入动作不会删除缓存,手动调用.RemoveDataCache()可以解决】 }, //1.如果存在事务所有操作都走主库,不存在事务 修改、写入、删除走主库,查询操作走从库 //2.HitRate 越大走这个从库的概率越大 SlaveConnectionConfigs = new List<SlaveConnectionConfig>() { new SlaveConnectionConfig() { HitRate = 10, ConnectionString = connStr1 } }, AopEvents = new AopEvents { OnLogExecuting = (sql, p) => { //System.Diagnostics.Debug.WriteLine(UtilMethods.GetSqlString(dbType, sql, p)); System.Diagnostics.Debug.WriteLine(UtilMethods.GetNativeSql(sql, p)); } } });
实体类
[SugarTable("test_remove_cache")] public class TestRemoveCache { [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int id { get; set; } [SugarColumn(IsArray = true, ColumnDataType = "int[]")] public int[] arr_col { get; set; } [SugarColumn(IsJson = true, ColumnDataType = "jsonb")] public List<int> json_col { get; set; } = new(); public byte[] byte_col { get; set; } public int int_col { get; set; } }
执行代码
public async Task<int> InsertTableAsync<T>(T model, string[] InsertColumns = null, bool NoIdentity = false) where T : class, new() { var xx = db.Insertable(model).RemoveDataCache().IgnoreColumns(ignoreNullColumn: true); if (InsertColumns != null) { xx.InsertColumns(InsertColumns); } if (NoIdentity) { return await xx.ExecuteCommandAsync(); } else { return await xx.ExecuteReturnIdentityAsync(); } }
热忱回答(28)
-
fate sta VIP02024/3/25
升级最新版本试一下
0 回复 -
道念迹奇 VIP02024/3/25
@fate sta:从4.几版本开始就有这个问题,我现在升级最新版本试试
0 回复 -
道念迹奇 VIP02024/3/25
@fate sta: 与版本:5.1.4.126 没区别
0 回复 -
fate sta VIP02024/3/25
@道念迹奇:我看代码有处理
0 回复 -
fate sta VIP02024/3/25
你写个独立DEMO试试
0 回复 -
道念迹奇 VIP02024/3/25
@fate sta:开始的时候与表字段类型有关,你可以试下上面提供是实体类
0 回复 -
fate sta VIP02024/3/25
@道念迹奇:
这个需要提供完整DEMO,二级缓存类都是自已实现的
0 回复 -
fate sta VIP02024/3/250 回复
-
fate sta VIP02024/3/250 回复
-
fate sta VIP02024/3/25
只要能进removeCacheFunc就进了你实现类
0 回复 -
道念迹奇 VIP02024/3/25
@fate sta:确实,换了一个项目用SqlSugarScope就可以正常调用,这个问题就很诡异了
0 回复 -
道念迹奇 VIP02024/3/25
@fate sta:项目跑了2年多,其他地方都没发现问题,唯独插入无法删除缓存这个问题一直存在,谢谢解惑,我再研究一下看看
0 回复 -
道念迹奇 VIP02024/3/25
@fate sta:是不是这个写法有问题,改成这个写法不会触发删除
var xx = db.Insertable(model).IgnoreColumns(ignoreNullColumn: true); if (InsertColumns != null) { xx.InsertColumns(InsertColumns); } if (NoIdentity) { return await xx.ExecuteCommandAsync(); } else { return await xx.ExecuteReturnIdentityAsync(); }
0 回复 -
道念迹奇 VIP02024/3/25
@fate sta:基本上可以确定是方法拆开写引起的
0 回复 -
fate sta VIP02024/3/25
@道念迹奇:你断点跟一下有没有进去。
0 回复 -
道念迹奇 VIP02024/3/25
@fate sta:嗯嗯,打了断点的,情况比较多,刚才测试页分了返回自增 id与不返回自增ID,辛苦你帮忙测下看下面两个分支:.ExecuteReturnIdentityAsync()这个不删除,.ExecuteCommandAsync()可删除
0 回复 -
fate sta VIP02024/3/25
@道念迹奇:你是这个意思吗?拆开来 配置自动 remove =true 二级缓存没清空是吧
var xx = db.Insertable(model).IgnoreColumns(ignoreNullColumn: true); await xx.ExecuteReturnIdentityAsync();
0 回复 -
道念迹奇 VIP02024/3/25
@fate sta:嗯嗯,其实执行返回自增ID连起来写也是没有触发删除二级缓存的
return await db.Insertable(model).RemoveDataCache().IgnoreColumns(ignoreNullColumn: true).ExecuteReturnIdentityAsync();
定位在:
await xx.ExecuteReturnIdentityAsync();
0 回复 -
fate sta VIP02024/3/250 回复
-
fate sta VIP02024/3/25
不是让你调的吗,我看有的啊
0 回复 -
fate sta VIP02024/3/25
进这个方法的
0 回复 -
fate sta VIP02024/3/25
最好提供一个DEMO吧,比什么都靠谱
0 回复 -
fate sta VIP02024/3/25
我这边测试可以清除
0 回复 -
fate sta VIP02024/3/25
注释掉后
0 回复 -
道念迹奇 VIP02024/3/26
@fate sta:好的,我剥离出来再试试
0 回复 -
道念迹奇 VIP02024/3/260 回复
-
fate sta VIP02024/3/26
@道念迹奇:
SqlSugarCore 5.1.4.149-preview20
过2分钟勾一下预览更新到这个版本 ,你这个可以重现
0 回复 -
道念迹奇 VIP02024/3/26
@fate sta:更新到149-pv20之后可以正常清除缓存了
0 回复