flu*_*ter 0 c# entity-framework entity-framework-core .net-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
Run Code Online (Sandbox Code Playgroud)
那么无论如何只需要在一个生命周期中使用一个连接DbContext?
你根本不需要改变它的工作方式,甚至根本不用担心它.默认情况下,SQL Server连接只是放回到连接池中,因此实际上它不会被关闭.打开一个新的将只是抓住池中的下一个可用.
你可以通过在连接字符串中设置值来控制池,而我建议不要这样做,除非你真的知道你在做什么,这些是使用的主要属性(来自MSDN):
连接生存期:将连接返回到池时,将其创建时间与当前时间进行比较,如果该时间跨度(以秒为单位)超过Connection Lifetime指定的值,则会破坏连接.这在群集配置中非常有用,可以在正在运行的服务器和刚刚联机的服务器之间强制实现负载平衡.值为零(0)将导致池化连接具有最大超时.
连接重置:确定从池中删除时是否重置数据库连接.对于Microsoft SQL Server 7.0版,设置为false可避免在获取连接时进行额外的服务器往返,但您必须意识到连接状态(如数据库上下文)未被重置.
Enlist:当为true时,如果存在事务上下文,则pooler会自动在创建线程的当前事务上下文中登记连接.
最大池大小:池中允许的最大连接数.
最小池大小:池中维护的最小连接数.
池化:如果为true,则从适当的池中提取连接,或者在必要时创建连接并将其添加到适当的池中.