EFCore 在 DbContext 的生命周期内使用单个数据库连接。

5

我正在使用EFCore将数据流式传输到后端数据库,对于每添加一个特定数量的新对象到数据集中,我调用SaveChanges。我从EFCore的调试日志中发现,每次调用SaveChanges时,它都会关闭连接并打开一个新连接:

Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerConnection|DEBUG|Opening connection to database ...
Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerConnection|DEBUG|Beginning transaction with isolation level 'Unspecified'.
Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerConnection|DEBUG|Committing transaction
Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerConnection|DEBUG|Closing connection to database...
.... the logs repeats forever

那么有没有办法在整个DbContext的生命周期中只使用一个连接?


2
问题:你为什么关心连接? - DavidG
1
答案:性能。 - fluter
你觉得它为什么会更快呢? - DavidG
建立连接和关闭连接需要时间,对吧?就像如果我接收服务器推送的数据,我会打开一个WebSocket并等待所有消息,我不能打开一个套接字接收一条消息然后关闭它,再打开一个新的套接字来接收第二条消息。 - fluter
1
这一切都是在EF之外完成的,您永远不需要担心它。如果您想进行配置,可以在连接字符串中设置某些属性。 - DavidG
显示剩余4条评论
1个回答

9

实际上,您没有必要改变它的工作方式,或者甚至不用担心它。默认情况下,SQL Server连接只是被放回到连接池中,因此实际上并没有关闭。打开一个新连接只是从池中获取下一个可用连接。

如果您确实想要控制连接池,可以通过在连接字符串中设置值来实现。但我建议你不要这样做,除非你真的知道自己在做什么。以下是主要使用的属性(来自MSDN):

Connection Lifetime:当连接返回到池中时,将其创建时间与当前时间进行比较,如果该时间跨度(以秒为单位)超过 Connection Lifetime 指定的值,则销毁该连接。在集群配置中,这很有用,可以在一个运行服务器和一个刚上线的服务器之间强制负载平衡。 值为零(0)会导致池化连接具有最大超时时间。

Connection Reset:确定在从池中删除连接时是否重置数据库连接。对于 Microsoft SQL Server 版本 7.0,设置为 false 可避免在获取连接时进行额外的服务器往返,但您必须注意,连接状态(如数据库上下文)不会被重置。

Enlist:如果存在事务上下文,则池程序将自动将连接在创建线程的当前事务上下文中登记。

Max Pool Size:池中允许的最大连接数。

Min Pool Size:池中维护的最小连接数。

Pooling:如果为 true,则从适当的池中获取连接;如果需要,还可以创建并添加到适当的池中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接