EF DBContext entsorgen nicht schließen der Verbindung
Ich bin mit dem EF 6.1.0
Habe ich unter benutzerdefinierte DBContex Objekt als DBEntites
public partial class DbEntities : DbContext
{
public DbEntities()
: base("name=DbEntities")
{
////Configuration.LazyLoadingEnabled = true;
////Configuration.ProxyCreationEnabled = false;
}
////I have ALL Entites added as below
////public virtual IDbSet<CCode> CCodes { get; set; }
}
Habe ich die unten angegebenen Operationen auf die Kontext-Objekt
using (var context = new DbEntities())
{
var entitySet = context.Set<T>();
var res = entitySet.Where<T>(predicate).ToList();
if (context.Database.Connection.State == ConnectionState.Open)
{
context.Database.Connection.Close();
}
return res;
}
Aber nach der Entsorgung der Kontext-Objekt, noch kann ich sehen, einen aktiven DB-Verbindung. Auf Verbindung Zustand kann ich sehen, dass die Verbindung bereits geschlossen ist(die Verbindung war nie true).
Ich bin mit der folgenden Abfrage, um zu sehen, die Verbindung auf SQL.
select db_name(dbid) , count(*) 'connections count'
from master..sysprocesses
where spid > 50 and spid != @@spid
group by db_name(dbid)
order by count(*) desc
Unter der unten angegebenen Anweisung eine sql-Verbindung Anzahl erhöht. Aber es war nie down, auch nach der Entsorgung . (Ich meine nach dem using-block excuted es soll um die Verbindung zu schließen).
var res = entitySet.Where<T>(predicate).ToList();
Jegliche Hilfe würde sehr geschätzt werden.
- Die meisten wahrscheinlich, dass ist, weil Sie das Verbindungs-pooling: öffnen und schließen von verbindungen ist teuer, so .NET hat einige verbindungen und wiederverwendet. msdn.microsoft.com/en-us/library/8xx3tyca(v=vs. 110).aspx
- Ich hoffe, dass so. aber in meinem Fall bin ich nicht wiederverwenden, das gleiche connection-Objekt.So dass ich t nicht nützlich für mich.
- Es geht nicht um die Wiederverwendung von connection-Objekt. Wenn Sie " neue Verbindung erstellen mit der gleichen Konfiguration (connection string), wird es nicht wirklich öffnen Sie eine neue Verbindung zur Datenbank, aber die Wiederverwendung von vorhandenen (wenn es eine ist im pool). Gleiche, wenn Sie in enger Verbindung Objekt - zugrunde liegende Verbindung kann nicht geschlossen werden, sondern werden stattdessen in den pool. Da Sie wahrscheinlich die Abfrage der gleichen Datenbank mehr als einmal während der Lebensdauer der Anwendung - das wird hilfreich sein für Sie.
- Sinn machen. Ich bestätige und markieren Sie als Antwort
- Sie können überprüfen, dass ich bei der "SqlConnection.ClearPool((SqlConnection) Kontext.Datenbank.Verbindung);" vor der Entsorgung Ihren Kontext. Dann nach dem entsorgen Sie Ihre Verbindung sollte wirklich geschlossen werden.
- Perfekt. Das ist richtig. Es ist wegen der Bündelung
- Ich denke, ich konnte Sie nicht markieren Sie als Antwort, bis Sie es post als Antwort
Du musst angemeldet sein, um einen Kommentar abzugeben.
So wurde herausgefunden, in der Kommentare, der Grund ist in der Tat Verbindungs-pooling durchgeführt .NET. .NET verwaltet einen pool von verbindungen für jede Verbindungszeichenfolge, die Sie in Ihrer Anwendung verwenden, für die perfomance-Gründen (weil das öffnen und schließen von verbindungen oft können teuer werden, in Bezug auf die Performance). Das Schwimmbad hat bestimmte minimale und die maximale Größe (gesteuert durch
MinPoolSize
undMaxPoolSize
connection-string Parameter). Wenn Sie eine Verbindung öffnen (überSqlConnection.Open
) - könnte es sein, aus dem pool genommen und nicht wirklich geöffnet von neuem. Wenn Sie die Verbindung schließen (was auch getan, indem du EF-Kontext) in Verbindung gebracht werden könnten, die in den pool statt, und nicht wirklich geschlossen. Wenn die Verbindung im Leerlauf für eine bestimmte Zeit (etwa 5 Minuten) - vielleicht ist es aus dem pool entfernt werden.Wenn du (aus irgendeinem Grund) vermeiden möchten, können Sie entweder MaxPoolSize zu 0 für den Verbindungs-string oder klaren pool explizit durch
SqlConnection.ClearPool
oderSqlConnection.ClearAllPools
.