2017-11-06 2 views
-2

Ich verwende C# LINQ zu SQL-Anwendung und meine Anwendung läuft 24 * 7 in Servern. Jetzt bin ich mit dem Problem konfrontiert Datenbank-Verbindungen, die sie nicht schließen, so dass aktive Verbindungen zu 200 und mehr erreichen. Ich verwendete Syntax überall dort, wo ich die Datenbank direkt behandle.Datenbankverbindung schließt nicht ordnungsgemäß

Aber das löst nicht mein Problem. Bitte überprüfen Sie und lassen Sie mich wissen, was ich dafür tun kann.

Provider hat immer meine Datenbank deaktiviert.

using (DataClassesDataContext DbContext = new DataClassesDataContext()) 
{ 
    return DbContext.tblApiLinks.FirstOrDefault(U => U.ProviderName == ProviderName); 
} 


using (DataClassesDataContext DbContext = new DataClassesDataContext()) 
     { 
      tblApiLink Apilink = new tblApiLink(); 
      Apilink.ApiUrl = Url; 
      Apilink.ApiKey = Key; 
      Apilink.ProviderName = Provider; 

      DbContext.tblApiLinks.InsertOnSubmit(Apilink); 
      DbContext.SubmitChanges(); 
     } 

New Edits

Fall 1. Überprüfen Sie bitte diese Code eine Tabelle zurück. Führt dies zum Schließen der Verbindung?

public tblApiLink getData() 
{ 
    using (DataClassesDataContext DbContext = new DataClassesDataContext()) 
{ 
    return DbContext.tblApiLinks.FirstOrDefault(U => U.ProviderName == ProviderName); 
} 
} 

tblApiLink api = getData(); 

Fall 2. Wenn ich wie verwendet, um dieses lst = dbContext.tblApiLinks tblApiLinks; Ich denke, das wird die Verbindung nicht schließen und sie werden die ganze Zeit aktiv sein.

Fall 3. Gibt es eine Möglichkeit, alle aktiven Verbindungen zu schließen, die seit langer Zeit aktiv sind und nicht verwendet werden.

+0

Fügen Sie Beispielcode für die Abfrage der Datenbank hinzu. –

+0

'" Bitte überprüfen Sie und lassen Sie mich wissen ... "' - Überprüfen Sie * was *, genau? – David

+0

@PankajMishra: Ich sehe nichts strukturell falsch mit dem Code gezeigt. Das Problem, das Sie beobachten, ist möglicherweise nicht so einfach wie das, was in diesem Code dargestellt wird. – David

Antwort

0

In Ihrem "Fall 1" versuchen Sie, eine Variable festzulegen, die das speichert, was Sie zurückgeben möchten, und den Wert zurückgeben, nachdem der Verwendungsblock geschlossen wurde.

Beispiel:

tblApiLink returnData = null; 
    using(DataClassesDataContext DbContext = new DataClassesDataContext()) 
    { 
     returnData = DbContext.tblApiLinks.FirstOrDefault(U => U.ProviderName == ProviderName); 
    } 
    return returnData; 

Randbemerkung: Der Typ tblApiLink nicht korrekt benannt nach Konvention, ich schlage vor, Sie es, wenn möglich, Refactoring.

Fall 2: Ich verstehe nicht, was Sie meinen.

Fall 3: Sie könnten einen Singleton verwenden, der Verbindungen verarbeitet und sie schließt, aber der richtige Weg, dies zu tun, besteht darin, die Verbindungen, die nicht mehr aktiv sind, zu entsorgen. Wenn Sie wirklich aktive Verbindungen beenden möchten, wäre Ihre beste Wette auf dem Server, entweder manuell oder Speichern einer Prozedur, die Sie später aufrufen können.