回答

收藏

EF DBContext处理不关闭连接

技术问答 技术问答 66 人阅读 | 0 人回复 | 2023-09-13

我正在使用EF 6.1.0- _: _1 q7 ~2 Z+ F2 m
我在下面将自定义DBContex对象作为DBEntites: R0 {/ ~- Y$ X2 Q: f2 L3 u* J
public partial class DbEntities : DbContext
0 N2 z  b. q8 \{
# ?. c& m' n4 L! W* D9 p' P6 ]% d    public DbEntities()+ }& N& M6 e5 D) ~2 z3 ?# D
        : base("name=DbEntities")6 X" [' s4 w$ Y
    {
5 j% d! |2 P# t* ]( n# Q; d0 [! J        ////Configuration.LazyLoadingEnabled = true;
$ y1 \. Y" j. i8 n4 N$ e9 c        ////Configuration.ProxyCreationEnabled = false;
, }% U# o( F1 u. Y; J    }
- M0 H( P; T9 c6 G6 _    //// I have ALL Entites added as below/ L7 W; r5 L! m  c) s  h
    ////public virtual IDbSet CCodes { get; set; }" N8 N, b- y  {2 |7 r1 s
}9 g" I6 ?! _4 W1 o. h6 h
我对上下文对象执行以下操作
6 P) c- Z6 _+ o- cusing (var context = new DbEntities())
( ^' Z1 u3 s% |6 J3 }0 e& r8 ]        {
3 J8 g! P& [7 l            var entitySet = context.Set();, W- z8 ^* q9 [$ H
            var res = entitySet.Where(predicate).ToList();4 G& E; p8 p. u$ {# M/ q$ t
            if (context.Database.Connection.State == ConnectionState.Open); r* a# Q6 \5 j$ P# @# D# l' D& q: b
            {0 t) s8 u8 v3 ^7 P% K; x/ F5 q" a
                context.Database.Connection.Close();
. u- O& l" {# s( ~6 `            }  Y" V* q- D+ [  g% l. r0 A
            return res;) K, M. X1 l5 w& y9 O; X) ?6 h
        }3 D$ F: c0 t$ U9 {0 k1 ^# ]$ V
但是在放置上下文对象之后,我仍然可以看到一个活动的数据库连接。在连接状态下,我可以看到该连接已经关闭(该连接从未为真)。
7 [9 V9 y9 P2 ]0 z7 \: F我正在使用以下查询来查看SQL上的连接。
# d+ W3 M/ `. G. Oselect db_name(dbid) , count(*) 'connections count'
5 {2 M; {: J  S* u' l1 P. Qfrom master..sysprocesses" o: s3 ?  [+ g4 s4 ?8 B9 [! c6 o
where spid > 50 and spid != @@spid
5 |# ?2 M3 Y9 X0 U; p& b  x* Hgroup by db_name(dbid)
% J/ O* O# u5 i  v# Lorder by count(*) desc& [+ j! f* F5 N+ s( J: O
在下面的语句中,增加了sql连接计数。但是即使处置了它也从未失败过。(我的意思是在使用块计算后,它应该关闭连接)。
! o6 X& ^- ~. L8 J5 `+ [. m4 ^var res = entitySet.Where(predicate).ToList();- H6 C  q& N# I4 T; Z: u, t
任何帮助将不胜感激。4 g. I5 i! }( ~% m9 @
                2 Z8 p# b; s# }; ^$ B( N1 g4 U+ X5 [
解决方案:8 C4 [0 s( d, n- h+ V
                . ?& P/ a5 N6 N, `5 r( Y! {  E

& m1 }5 C0 s# G( y& p  K8 O# A3 {. T. ]. g
                正如评论中指出的那样,其原因确实是.NET执行的连接池。出于性能方面的原因,.NET会为您在应用程序中使用的每个连接字符串维护一个连接池(因为打开和关闭连接在性能方面通常可能会很昂贵)。该池具有一定的最小和最大大小(由MinPoolSize和MaxPoolSize连接字符串参数控制)。当您打开一个连接(通过SqlConnection.Open)时-它可能会从池中移出,而实际上并没有重新打开。当您关闭连接时(也可以通过布置EF上下文来完成)-连接可能会改为放入池中,并没有真正关闭。如果连接空闲了一定时间(大约5分钟),则可能会将其从池中删除。
7 b7 d- Y; E6 A+ r  z* E6 G如果(出于某种原因)想要避免这种情况,可以将连接字符串的MaxPoolSize设置为0,或者通过SqlConnection.ClearPool或显式清除池SqlConnection.ClearAllPools。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则