大发uu快3_uu快3棋牌_大发uu快3棋牌

EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

时间:2019-12-11 08:56:00 出处:大发uu快3_uu快3棋牌_大发uu快3棋牌

DbContextPool 是 ASP.NET Core 2.1 引入的新形态,还会 节省创建 DbContext 实例的开销,但这样 想到其中藏着另一个小坑。

最近另一个 ASP.NET Core 项目持续运行一段时间后日志中就会时不时 出现 数据库连接池达到最大连接数限制的错误:

System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
   at System.Data.Common.ADP.ExceptionWithStackTrace(Exception e)

现在开始英语 英语 英语 以为是哪个地方的代码造成 DbContext 能够正常 Dispose ,但在代码中这样 找到任何相关线索。然后 人太好这样 一些还会 怀疑的地方,唯有 DbContextPool ,于是尝试加在 DbContextPool ,结果错误就消失了。岂还会 是 DbContextPool 引起的,但让人纳闷的是 DbContextPool 以前 也不我为了节省创建 DbContext 实例的开销,为何反而消耗更多数据库连接,然后 你这个 项目的负载很低,为何原因分析分析 把整个连接池都消耗殆尽呢?

今天在周会上谈了你这个 怪问题图片,然后 时不时 想到:每个 DbContext 实例还会占用另一个数据库连接(SqlConnection),不启用 DbContextPool 的以前,请求一现在开始英语 英语 英语 ,对应 DbContext 实例就被 Dispose ,数据库连接就会被放回连接池。而使用 DbContextPool 的以前,请求现在开始英语 英语 英语 后 DbContext 还会被 Dispose 也不我被放回 DbContextPool ,DbContext 被放回属于当事人的池中,就原因分析分析 它对应的数据库连接还会被放回它所属的连接池。DbContextPool 中的每另一个 DbContext 都对应另一个数据库连接,DbContextPool 中每多另一个 DbContext ,数据库连接池中就会少另一个数据库连接。当你这个 另一个池的大小不一样且 DbContextPool 大于数据库连接池,问题图片就来了,DbContextPool 根据自家池(假设是128)子的大小畅快地向池中填 DbContext ,浑然不顾数据库连接池的大小(假设是3000),当填到第 101 个 DbContext 时就会时不时 出现 后面 的错误。

你这个 项目中用的还会 默认设置,是还会 默认设置就会触发你这个 问题图片呢?

查看 DbContextPool 的 实现源码 发现池的默认大小限制是 128

public static IServiceCollection AddDbContextPool<TContext>(
    [NotNull] this IServiceCollection serviceCollection,
    [NotNull] Action<DbContextOptionsBuilder> optionsAction,
    int poolSize = 128)
    where TContext : DbContext
    => AddDbContextPool<TContext, TContext>(serviceCollection, optionsAction, poolSize);

查看 SqlConnention 的 实现源码 发现连接池的默认大小限制是 3000

internal const int Max_Pool_Size = 3000;

默认设置就会触发问题图片,实确人太好的另一个小坑。

知道了原因分析分析 ,正确处理起来就很简单了,将 DbContextPool 的 poolSize 设置为小于数据库连接池的 Max_Pool_Size

services.AddDbContextPool<JobDb>(option =>
    option.UseSqlServer(Configuration.DbConnectionStr()), 
    poolSize: 64);

热门

热门标签