草庐IT

EF7上下文池

OoO 2023-03-28 原文

为什么使用DbContext池?

DbContext是Entity Framework中最重要的类型之一,它提供了一种连接数据库并执行查询和更新的方式。在一个ASP.NET Core应用程序中,每次请求都可能需要对数据库进行一次或多次查询。在这种情况下,为每个请求创建新的DbContext实例并不是一个好的选择,因为这样做可能会导致内存和性能问题。
DbContext池允许应用程序在需要时重用已经创建的DbContext实例,从而提高性能并减少内存消耗。
性能基准

DbContext池的工作原理

DbContext池是一个对象池,它维护一组可用的DbContext实例,这些实例是预先创建好的,缓存在池子中。当应用程序需要一个新的DbContext实例时,它可以从池子中获取一个已有的实例,使用完后再将其释放回池子中,以供下一次使用。
DbContext池的大小是由应用程序的配置来控制的。默认情况下,DbContext池的大小是1024,但是我们也可以通过代码进行手动配置。例如,我们可以使用以下代码手动配置DbContext池的大小:

Services.AddDbContextPool<DbContext>(options => options.UseSqlServer(""), poolSize: 10);

在这里,我们将DbContext池的大小设置为10个实例。
超过poolSize会怎么样?

微软官网:一旦超过 poolSize,就不会缓存新的上下文实例,EF 会回退到按需创建实例的非池行为。

DbContext池中每个DbContext的生命周期

每个DbContext实例代表了应用程序与数据库的会话(Session),池中每个DbContext实例的生命周期与依赖注入时的声明周期有关,默认DbContext是以范围生命周期(Scope)注册服务的(这是最佳的方式)。

微软官网:Entity Framework Core 不支持在同一 DbContext 实例上运行多个并行操作。 这包括异步查询的并行执行以及从多个线程进行的任何显式并发使用。 因此,始终立即 await 异步调用,或对并行执行的操作使用单独的 DbContext 实例。

释放DbContext池中的DbContext

官方推荐使用自定义上下文工厂:看文档(管理共用上下文中的状态)这里与文档冲突,我就不说了。

总结

DbContext池是为了提高性能而引入的概念。它可以缓存DbContext实例,避免了创建和销毁DbContext实例的开销,同时还可以减轻数据库的负担。

有关EF7上下文池的更多相关文章

  1. ruby - 在 Ruby 中,在类方法的上下文中,什么是实例变量和类变量? - 2

    如果我有以下一段Ruby代码:classBlahdefself.bleh@blih="Hello"@@bloh="World"endend@blih和@@bloh到底是什么?@blih是Blah类中的一个实例变量,@@bloh是Blah类中的一个类变量,对吗?这是否意味着@@bloh是Blah的类Class中的一个变量? 最佳答案 人们似乎忽略了该方法是类方法。@blih将是常量Bleh的类Class实例的实例变量。因此:irb(main):001:0>classBlehirb(main):002:1>defself.blehirb

  2. ruby - 在 Ruby 中的另一个上下文中评估潜在的相对 URI - 2

    我在Ruby程序中有两个URI。一个肯定是绝对URI,另一个可能是绝对URI或相对URI。我想在第一个的上下文中将第二个转换为绝对URI,所以如果第一个是http://pupeno.com/blog第二个是/about,结果应该是http://pupeno.com/about.有什么想法吗? 最佳答案 Ruby的内置URI和Addressablegem,做这个简短的工作。我更喜欢Addressable,因为它功能更全面,但URI是内置的。require'uri'URI.join('http://pupeno.com/blog','/

  3. Ruby 将上下文分配给 lambda? - 2

    是否可以不为lambda分配上下文?例如:classRuledefget_rulereturnlambda{putsname}endendclassPersonattr_accessor:namedefinit_rule@name="ruby"Rule.new.get_rule.call()#shouldsay"ruby"butsaywhatobjectofclassRull,doesnothavevariablename#orself.instance_eval&Rule.new.get_ruleendend我的目标是->没有上下文的存储过程对象,并在特定位置调用之前分配上下文。可能

  4. ruby - 从上面的上下文返回 - 2

    这个问题的表述并不复杂,但我会尽力而为。通过我们的代码,我们有一些片段,例如response=do_something()returnresponseunlessresponse.ok?我想写一个包装器方法,这样就不需要这一步了,它看起来像这样defrr(&block)response=yieldunlessresponse.ok?#somehowdoreturnbutincontextabove(magicneededhere)endresponseend之后我就可以将上面的代码最小化为response=rr{do_something()}似乎不可能,但这是Ruby所以也许有办法吗?

  5. ruby - 调用 instance_eval(&lambda) 传递当前上下文时出现错误 'wrong number of arguments' - 2

    要清楚-此代码运行完美-codewithproc但如果我将Proc.new更改为lambda,则会出现错误ArgumentError:wrongnumberofarguments(1for0)这可能是因为instance_eval想要将self作为参数传递,而lambda将其视为一种方法并且不接受未知参数?有两个例子-第一个是工作:classRuledefget_ruleProc.new{putsname}endendclassPersonattr_accessor:namedefinit_rule@name="ruby"instance_eval(&Rule.new.get_rule

  6. ruby-on-rails - Ruby on Rails : Acts as taggable on gem, 在模型中使用上下文 - 2

    我想知道是否有人可以帮助我理解文档中的这一部分:Withthedefinedcontextinmodel,youhavemultiplenewmethodsatdisposaltomanageandviewthetagsinthecontext.Forexample,with:skillcontextthesemethodsareaddedtothemodel:skill_list(andskill_list.add,skill_list.removeskill_list=),skills(plural),skill_counts.我有这个:型号:classProjectControl

  7. Ruby 相当于 "grep -C 5"以获取匹配项周围的行的上下文? - 2

    我搜索了一下,但我一定是使用了错误的术语-ruby​​是否有办法grep查找字符串/正则表达式并返回周围的5行(上方和下方)?我知道我可以调用"grep-C5..."或什至编写我自己的方法,但这似乎是ruby​​应该有的东西,我只是没有使用正确的搜索词。 最佳答案 您可以使用正则表达式来完成。这是我们要搜索的字符串:s=%{ThefirstlineThesecondlineThethirdlineThefourthlineThefifthlineThesixthlineTheseventhlineTheeightlineThenin

  8. ruby - 解决 Sinatra 路由方法中缺乏上下文的问题 - 2

    在调用我的路由时,我一直遇到缺少实例和nilClass错误的问题。在研究源代码之后,generate_method调用似乎基本上使用初始方法的block创建了一个新方法。get"/"do@some_local_instance.do_something()end所以在上面的方法中,该类中很可能有一个名为some_local_instance的局部变量,但是当实际计算死记硬背时,它没有关于方法定义位置的上下文,因此它会失败。我问的原因是因为作为脚本的一部分,我有外部类,当加载Sinatra时加载这些注册路由,当调用这些路由时,我需要访问这些类上的一些局部变量。一个例子是:classSom

  9. ruby - 在Ruby 中,有没有办法在当前上下文中动态定义局部变量? - 2

    这个问题在这里已经有了答案:Howtodynamicallycreatealocalvariable?(4个答案)关闭7年前。我想知道是否有一种方法可以让我在当前上下文中动态定义以前undefinedvariable。例如:foo#=>NameError:undefinedmethodorlocalvariable...#Somemethodcallwhichsetsfoo=1inthelocalcontextfoo#=>1换句话说,假设foo是未定义的,我正在寻找任何可以让我在不使用foo的情况下定义局部变量foo的代码变量(例如,如果我有一些其他变量bar其值为:foo并且我不得不

  10. ruby - Ruby 方法能否作为迭代器产生或根据上下文返回数组? - 2

    我在Ruby中有一个任意方法可以产生多个值,因此可以将其传递给一个block:defarbitraryyield1yield2yield3yield4endarbitrary{|x|putsx}我想修改此方法,以便在没有block的情况下,它仅将值作为数组返回。所以这个构造也可以工作:myarray=arbitrarypa----->[1,2,3,4,5]这在Ruby中可行吗? 最佳答案 defarbitraryvalues=[1,2,3,4]returnvaluesunlessblock_given?values.each{|va

随机推荐