EF Core DbContext连接池获取与归还时机及事务场景疑问
EF Core DbContext连接池使用常见问题解答
1. EF Core DbContext何时从连接池获取连接,何时将连接归还至连接池?
- 获取连接:当DbContext需要执行数据库操作(如查询、
SaveChanges、开启事务)时,若当前无已打开的连接,EF Core会从连接池复用空闲连接或获取新连接。 - 归还连接:
- 无事务场景下,数据库操作完成后立即归还连接至池;
- 事务场景下,连接会被持有至事务提交或回滚后再归还;
- DbContext被
Dispose时,若仍有未归还的连接,会强制归还。
2. DbContext是在Dispose()后释放连接到连接池,还是在每次查询和SaveChanges()操作时分别获取并释放连接?
- 无事务的常规场景下,每次查询、
SaveChanges等数据库操作完成后,EF Core会立即将连接归还至连接池,无需等到Dispose。 - 仅当连接被事务占用,或手动调用
OpenConnection()保持连接打开时,才会等到事务结束或Dispose时归还连接。
3. 示例代码中,.FirstOrDefault()查询与SaveChanges()操作是否可能使用不同的连接?还是始终使用同一连接?
- 可能使用不同的连接。
FirstOrDefault()执行完毕后,连接会被立即归还到连接池;后续调用SaveChanges()时,会重新从连接池获取连接(可能是新连接,也可能是之前归还的空闲连接,取决于连接池状态)。 - 若在代码中开启事务(如调用
dbContext.Database.BeginTransaction()),则两个操作会共用同一个连接,直到事务完成。
4. 使用事务时,连接的使用情况是怎样的?
- 当通过
BeginTransaction()或TransactionScope开启事务时,EF Core会立即从连接池获取连接,并持续持有该连接,直到事务提交或回滚。 - 事务期间,所有数据库操作(查询、
SaveChanges等)都会使用这个被持有的连接,不会中途归还至池。 - 事务完成后,连接会被归还到连接池,供后续操作复用。
示例代码
using (MainDbContext dbContext = new MainDbContext()) { KvPair kvPair = dbContext.KvPairs.FirstOrDefault(r => r.Key == Configs.AutoStartKey); if (kvPair == null) { kvPair = new KvPair(); kvPair.Id = SequenceId.New32String(); kvPair.Key = Configs.AutoStartKey; kvPair.Value = isAutoStartUp ? "1" : "0"; kvPair.UpdateTime = kvPair.CreateTime = DateTime.Now; dbContext.KvPairs.Add(kvPair); dbContext.SaveChanges(); } else { kvPair.Value = isAutoStartUp ? "1" : "0"; kvPair.UpdateTime = DateTime.Now; dbContext.SaveChanges(); } }
内容的提问来源于stack exchange,提问作者lcm
相关产品推荐
相关产品推荐

