2009-08-26 7 views
0

Ich habe eine Utility-Klasse, die erstellt & eine DB-Verbindung zurückgibt:VB.net: Probleme mit einer Shared-Methode zum Abrufen einer Db-Verbindung?

Public Shared Function GetConnection() as OracleConnection 
    dim c as New OracleConnection() 
    ... set connection string... 
    c.Open() 
    Return c 
End Function 

Gibt es ein Risiko gleichzeitiger Anrufe die gleiche Verbindung Rückkehr? Die Verbindungszeichenfolge aktiviert das Pooling.

Antwort

1

Da Sie jedes Mal eine neue Verbindung zurückgeben, haben Sie keine Nebenläufigkeitsprobleme. Wenn Sie eine Shared-Methode verwenden, um mehrere Referenzen auf die selbe Instanz zurückzugeben, könnte das ein Problem sein, aber das ist nicht, was Sie hier tun.

Sie können diese Methode auf diese Weise sicher verwenden, solange Sie jedes Mal eine neue Instanz Ihres Datenbankverbindungsobjekts zurückgeben. Jedes Verbindungspooling funktioniert auch genauso wie es immer wäre - Sie müssen sich auch keine Gedanken über Ihre Shared Methodenverwendung machen.

1

Vergessen Sie das gleichzeitige Anrufproblem für einen Moment. Wenn ein Verbindungspooling stattfindet, müssen Sie unbedingt die gleichen zugrunde liegenden Datenbankverbindungen wiederverwenden, auch wenn sie nicht dasselbe Objekt verwenden.

Dies ist im Allgemeinen eine wünschenswerte Sache, da das Öffnen einer Verbindung zu der DB eine teure Operation sein kann.

Sind Sie besorgt, das Verbindungsobjekt unter einem anderen Anrufer zu schließen? Wenn dies der Fall ist, denke ich, dass Sie mit dem von Ihnen bereitgestellten Code sicher sind.

+1

Es gibt Pooling, aber ich nehme an, dass der Poolmanager eine Verbindung nicht erneut ausgibt, bis sie geschlossen wurde. Zu diesem Zeitpunkt wird die Verbindung zum Pool wiederhergestellt. – chris

0

Ich glaube nicht.

Da c eine lokale Variable ("Stapelvariable") und keine statische Variable ist, hat jeder Aufruf eine eigene Instanz von c. Als nächstes erstellen Sie ein neues Objekt (die Verbindung) und geben dieses zurück.

0

Sollte kein Problem mit Nebenläufigkeit sein, da jeder Anruf eine neue Verbindung ist.

Ich könnte jedoch eine Änderung vornehmen: machen Sie die Methode private.

Dadurch werden Sie gezwungen, Ihren gesamten Datenzugriffscode in einer Klasse zu speichern und eine schöne separate Datenzugriffsebene zu erstellen. Zumindest machen Sie es internal, so dass Ihre Datenzugriffsebene auf eine einzige Assembly beschränkt ist (das ist getrennt von dem Rest Ihres Codes).