2009-08-23 11 views
2

Ich würde gerne wissen, ob es Probleme beim Aufruf einer statischen Methode von einem ASP.NET-Webdienst gibt.Fallstricke beim Aufrufen der statischen Methode von ASMX

internal static object SelectScalar(String commandText, DataBaseEnum dataBase) 
    { 
     SqlConnection sqlc = new SqlConnection(AuthDbConnection.GetDatabaseConnectionString()); 
     object returnval=null; 
     if (sqlc!=null) 
     { 
      SqlCommand sqlcmd = sqlc.CreateCommand(); 
      sqlcmd.CommandText = commandText; 
      sqlc.Open(); 
      returnval = sqlcmd.ExecuteScalar(); 
     } 
     return returnval; 
    } 

So für ein das Verfahren obigen Beispiel; gibt es irgendwelche Fallstricke bei mehreren Webmethoden und mehrere Clients, die diese Methode gleichzeitig aufrufen (sagen wir 1000 Aufrufe an eine Webmethode, die diese Funktion aufruft)?

Antwort

3

Da Sie ein neues SqlConnection erstellen, möchten Sie es entsorgen oder die Verbindung wird nicht geschlossen. Hinweise zur Verwendung finden Sie unter MSDN.

Die Tatsache, dass es sich um eine statische Methode handelt ... scheint jedoch kein Problem zu sein, da Sie keinen gemeinsamen Status aktualisieren (globale Variablen).

EDIT: AFAIK, die "Fallstricke" der statischen Methoden in Webservices sind die gleichen wie in jeder anderen Anwendung. Zu beachten ist lediglich, dass es sich bei einem Webservice um einen Server handelt, von dem erwartet wird, dass er über einen langen Zeitraum zuverlässig läuft. Somit sind Dinge, die im Laufe der Zeit Probleme verursachen könnten (Speicherlecks, Erschöpfung der Datenbankverbindung usw.), signifikanter als für andere Anwendungen, die für einen viel kürzeren Zeitraum laufen.

+0

Yeah ... Ich hätte mir andere Aspekte des Codes ansehen sollen, abgesehen davon, dass er threadsicher ist. +1 für dich. –

+0

Ich habe gerade diesen kleinen Ausschnitt bearbeitet. Wir schließen die Verbindung. – choudeshell

3

Zu beachten ist, wenn statische Mitglieder den Status ändern, auf den andere Threads in der Anwendungsdomäne zugreifen können. In diesen Fällen müssen Sie die richtigen Maßnahmen ergreifen, damit dies ordnungsgemäß geschieht.

Ihre Methode berührt keinen Zustand aus sich heraus (alles ist lokal), also sind Sie in Ordnung.


Als duffymo und nader erwähnt, sollen Sie Ihre Verbindung verfügen, wie Sie jedes Objekt dipose sollten die IDisposable implementiert.

3

Ich weiß nicht, ob C# wie Java ist, aber eine SQL-Verbindung zu öffnen und es nicht zu schließen, bevor ich die Methode verlasse, scheint mir keine gute Idee zu sein. Der GC bereinigt es, sobald es den Gültigkeitsbereich verlässt, aber das ist nicht dasselbe wie das Schließen der Verbindung in Java.

Das Idiom in Java würde verlangen, dass Sie die Verbindung in einem finally Block schließen. Wenn Sie sich nicht sicher sind, dass die C# -Klasse so etwas nicht benötigt, würde ich mich darum kümmern.

Sie werden es bald herausfinden - Tausende von Internetanrufen werden die Anzahl der verfügbaren Verbindungen schnell ausschöpfen, wenn sie knapp sind.

Eine weitere Sache zu überprüfen: Öffnen von Verbindungen auf diese Weise ist teuer in Java, so dass sie in der Regel gepoolt werden. Wird das Verbindungs-Pooling auch in C# durchgeführt? Ist es ineffizient, eine Datenbankverbindung zu öffnen und zu schließen? Könnten Sie dasselbe mit einer statischen, geteilten Verbindung erreichen? Wenn Sie diesen Weg gehen, kommen vielleicht Threading-Probleme ins Spiel.

+0

Sie schreiben über die Notwendigkeit, über die Verbindung zu disponieren. +1 für dich. –

+0

@duffymo: Yup, Pooling ist verfügbar. Siehe http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.71).aspx –

+0

Entschuldigung, ich habe dieses kleine Snippet einfach kopiert und bearbeitet. Ja - wir schließen die Verbindung und verwenden das Verbindungspooling. Ich habe mich nur gefragt, ob da irgendwelche Fallstricke sind - nicht wirklich sicher, welche Art oder Art von Fallstrick. Wir verwenden diese Art von Paradigma an vielen Orten. – choudeshell

Verwandte Themen