PGSQL异步插入语句不会自动删除二级缓存 返回

SqlSugar 处理完成
28 587

【版本: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 fate sta VIP0
    2024/3/25

    升级最新版本试一下

    0 回复
  • @fate sta:从4.几版本开始就有这个问题,我现在升级最新版本试试

    0 回复
  • @fate staimage.png 与版本:5.1.4.126 没区别

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    @道念迹奇:我看代码有处理

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    你写个独立DEMO试试

    0 回复
  • @fate sta:开始的时候与表字段类型有关,你可以试下上面提供是实体类

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    @道念迹奇

    这个需要提供完整DEMO,二级缓存类都是自已实现的

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    image.png


    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    image.png

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    只要能进removeCacheFunc就进了你实现类

    0 回复
  • @fate sta:确实,换了一个项目用SqlSugarScope就可以正常调用,这个问题就很诡异了

    0 回复
  • @fate sta:项目跑了2年多,其他地方都没发现问题,唯独插入无法删除缓存这个问题一直存在,谢谢解惑,我再研究一下看看

    0 回复
  • @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 回复
  • @fate sta:基本上可以确定是方法拆开写引起的

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    @道念迹奇:你断点跟一下有没有进去。

    0 回复
  • @fate sta:嗯嗯,打了断点的,情况比较多,刚才测试页分了返回自增 id与不返回自增ID,辛苦你帮忙测下看下面两个分支:.ExecuteReturnIdentityAsync()这个不删除,.ExecuteCommandAsync()可删除

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    @道念迹奇:你是这个意思吗?拆开来 配置自动 remove =true  二级缓存没清空是吧

     var xx = db.Insertable(model).IgnoreColumns(ignoreNullColumn: true);
    
     await xx.ExecuteReturnIdentityAsync();


    0 回复
  • @fate sta:嗯嗯,其实执行返回自增ID连起来写也是没有触发删除二级缓存的


     return await db.Insertable(model).RemoveDataCache().IgnoreColumns(ignoreNullColumn: true).ExecuteReturnIdentityAsync();


    定位在:

    await xx.ExecuteReturnIdentityAsync();


    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    image.png

    image.png

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    不是让你调的吗,我看有的啊

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    进这个方法的

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    最好提供一个DEMO吧,比什么都靠谱

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    image.png

    image.png

    我这边测试可以清除

    0 回复
  • fate sta fate sta VIP0
    2024/3/25

    注释掉后

    image.png


     image.png

    0 回复
  • @fate sta:好的,我剥离出来再试试

    0 回复
  • TestSqlSugarApp.zip

    demo在此,需要修改一下redis连接串与pgsql连接串,看下是不是我使用的姿势不对

    @fate sta

    0 回复
  • fate sta fate sta VIP0
    2024/3/26

    @道念迹奇

    SqlSugarCore 5.1.4.149-preview20

     过2分钟勾一下预览更新到这个版本 ,你这个可以重现 

    0 回复
  • @fate sta:更新到149-pv20之后可以正常清除缓存了

    0 回复