EFCore在dbcontext的生命周期中使用单个dbconnect

时间:2017-07-26 14:11:42

标签: c# entity-framework .net-core entity-framework-core

我正在使用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的整个生命周期中只使用一个连接吗?

1 个答案:

答案 0 :(得分:6)

您根本不需要改变它的工作方式,甚至根本不用担心它。默认情况下,SQL Server连接只是放回到连接池中,所以实际上它并没有关闭。打开一个新的只会抓住池中的下一个。

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

  

连接生存期:当连接返回到池时,会将其创建时间与当前时间进行比较,如果该时间跨度(以秒为单位)超过指定的值,则会破坏连接。连接寿命。这在群集配置中非常有用,可以在正在运行的服务器和刚刚联机的服务器之间强制实现负载平衡。   值为零(0)将导致池化连接具有最大超时时间。

     

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

     

登记:如果为true,则如果存在事务上下文,则pooler会自动在创建线程的当前事务上下文中登记连接。

     

最大池大小:池中允许的最大连接数。

     

最小池大小:池中维护的最小连接数。

     

合并:如果为true,则从相应的池中提取连接,或者在必要时创建连接并将其添加到相应的池中。