让EFCore更疯狂些的扩展类库(二):查询缓存、分部sql、表名替换、遍历的策略配置

前言

上一篇介绍了扩展类库的功能简介,通过json文件配置sql语句 和 sql语句的直接执行,这篇开始说明sql配置的策略模块:策略管理器与各种策略的配置。

  类库源码:github:https://github.com/skigs/EFCoreExtend

  引用类库:nuget:https://www.nuget.org/packages/EFCoreExtend/

     PM> Install-Package EFCoreExtend

 

策略管理器功能简介

用于管理策略 与 策略执行器和调用(目前分为三种策略执行器),目的为了让配置的sql语句更加简单、自动化等等。

1) 策略类型管理

  a) 管理各种策略类型,用于初始化配置文件中的策略配置转换成对象

2) 策略对象配置

  a) 通过 sql配置的执行器 的形参传递策略对象

  b) 通过 配置文件(分为表和sql) 配置策略对象

  c) 配置到 全局策略 中(策略管理器中)

  d) 策略对象获取的优先级:通过执行器的形参传递的策略对象 > sql配置的策略对象 > 表配置的策略对象 > 全局策略中配置

3) 策略执行器(一般通过策略对象进行相应的处理)

  a) 初始化型的策略执行器:这种类型的会在第一次调用GetExecutor的时候执行,只会执行一次,除非sql配置有改动

    1.  配置策略对象的初始化、替换表名、合并分部sql等的策略执行器

  b) sql执行前的策略执行器:一般用于对SqlParameter进行解析到sql中

    1.  foreach策略执行器:对SqlParameter或者某些数据类型(list/dictionary/model)进行遍历生成字串替换到sql中

  c) sql执行时的策略执行器:一般用于缓存和日志记录

    1.  sql与参数的日志记录策略执行器
    2.  查询缓存与清理策略执行器

 

表名替换策略

通过特定的标签代替表名在sql配置中呈现(该策略对象默认已经添加到全局策略中,因此并不一定要在配置文件中配置):

{
  "policies": { //表配置的策略对象(会包含到表下的所有sql配置中)
    //表名策略
    "tname": {
      //"tag": "##tname"  //默认值为 ##tname
    }
  },
  "sqls": {
    "GetList": {
      "sql": "select * from ##tableName where name=@name", // => select * from [Person] where name=@name
      "type": "query",
      "policies": { //sql配置的策略对象
        //表名策略
        "tname": {
          "tag": "##tableName", //默认值为 ##tname
          "prefix": "[", //前缀
          "suffix": "]" //后缀
        }
      }
    }
  }
}

配置初始化:

 1         public static void Init()
 2         {
 3             //加载配置
 4             EFHelper.Services.SqlConfigMgr.Config.LoadDirectory(Directory.GetCurrentDirectory() + "/Datas");
 5 
 6             //设置到全局策略中(一般用于设置 初始化型的策略对象),将策略对象设置到全局之后,会包含到所有配置中的
 7             EFHelper.Services.SqlConfigMgr.PolicyMgr.SetGlobalPolicy(
 8                 //TableNamePolicy对象默认已经添加到全局策略中
 9                 new TableNamePolicy    //表名策略在配置文件中呈现的key:tname(可以通过SqlConfigConst.TableNamePolicyName获取)
10                 {
11                     Tag = "##tname",
12                 });
13         }

配置执行器调用:

 1         public IReadOnlyList<Person> GetList()
 2         {
 3             tinfo = db.GetConfigTable<Person>();
 4             return tinfo.GetExecutor().QueryUseModel<Person>(new
 5             {
 6                 name = "tom"
 7             }, null, null,
 8             //通过参数传递策略对象(一般用于设置 sql执行前 或 执行时的策略对象,
 9             //      而初始化型的一般在配置文件或全局策略中设置)
10             new[] { new SqlL2QueryCachePolicy() });
11         }

说明:

策略对象获取的优先级(如果策略对象设置到多个地方了): 执行器形参传递的策略对象 >  sql配置的策略对象 >  表配置的策略对象 >  全局策略中配置

 

分部sql策略

分部sql目的为了将sql分部在不同的配置中,以便sql的可重用:

Person.json配置:

{
  "sqls": {
    "GetListSection": {
      "sql": "select * from ##tname where #{WhereSec}",    
        //最终生成的sql:select * from Person where name=@name or addrid in (select id from Address where id=@addrid)
      "type": "query",
      "policies": {
        //分部sql策略,以便将sql分部在不同的配置中(注意:分部策略是对sql的分部,可以在分部sql下再进行分部sql(子分部),但是不会继承分部sql中的policies(策略对象)等的配置)
        "section": {
          //"tagPrefix": "#{", //策略前缀标记符,默认为 #{
          //"tagSuffix": "}", //策略后缀标记符,默认为 }
          "sqlNames": [ "WhereSec" ] //指定sql的名称(同表下的SqlName)
          //"tableSqlNames": { //指定其他表的sql名称(key为TableName,value为SqlName)
          //}
        }
      }
    },
    "WhereSec": {
      "sql": " #{WhereSec1} or addrid in (#{Address.ListSec}) ",
      "type": "nonexecute",    //不用于执行的sql类型
      "policies": {
        "section": {
          "sqlNames": [ "WhereSec1" ],
          "tableSqlNames": { //指定其他表的sql名称(key为TableName,value为SqlName)
            "Address": "ListSec"
          }
        }
      }
    },
    "WhereSec1": {
      "sql": "name=@name",
      "type": "nonexecute"
    }
  }
}

Address.json

{
  "sqls": {
    "ListSec": {
      "sql": "select id from ##tname where #{WhereSec}",
      "type": "nonexecute",
      "policies": {
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 Redis 连接池在 Golang 中的使用,我可以给您提供一些相关的类库和示例代码。 首先,Golang 中比较常用的 Redis 客户端有以下几个: 1. go-redis/redis 2. go-redis/cache 3. redigo 这三个客户端都支持连接池的使用,下面分别介绍一下它们的连接池使用方法。 1. go-redis/redis go-redis/redis 是 Redis 的 Golang 客户端,它提供了一个叫做 "Options" 的结构体,可以用来设置 Redis 连接池的相关选项,例如最大连接数、闲置连接数等等。 示例代码: ```go import ( "github.com/go-redis/redis" ) func main() { options := &redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB PoolSize: 10, } client := redis.NewClient(options) } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大连接数为 10。 2. go-redis/cache go-redis/cache 是 go-redis/redis 的一个扩展库,它提供了一个基于 Redis 的缓存实现。它同样支持 Redis 连接池的使用,可以通过设置 "Options" 结构体中的 "PoolSize" 字段来设置最大连接数。 示例代码: ```go import ( "github.com/go-redis/cache/v8" "github.com/go-redis/redis/v8" ) func main() { options := &redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB PoolSize: 10, } client := redis.NewClient(options) cache := cache.New(&cache.Options{ Redis: client, LocalCache: cache.NewTinyLFU(1000, time.Minute), TTL: time.Hour, }) } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大连接数为 10,并且使用 go-redis/cache 库创建了一个基于 Redis 的缓存实现。 3. redigo redigo 是 Redis 的 Golang 客户端,它同样支持 Redis 连接池的使用,可以通过设置 "Pool" 结构体中的 "MaxIdle" 和 "MaxActive" 字段来设置最大空闲连接数和最大活跃连接数。 示例代码: ```go import ( "github.com/gomodule/redigo/redis" ) func main() { pool := &redis.Pool{ Dial: func() (redis.Conn, error) { return redis.Dial("tcp", "localhost:6379") }, MaxIdle: 10, MaxActive: 100, } conn := pool.Get() } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大空闲连接数为 10,最大活跃连接数为 100。 以上就是三个常用的 Golang Redis 客户端的连接池使用方法,您可以根据实际需求选择适合自己的客户端和连接池设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值