2008-11-19 10 views
5

Jeder weiß, dass Sie eine Verbindung sofort nach der Verwendung schließen sollten.Ist es akzeptabel, eine db-Verbindung für die Lebensdauer der Seite offen zu halten?

Aufgrund eines Fehlers in meinem Domänenobjektmodellentwurf musste ich die Verbindung für den gesamten Seitenlebenszyklus geöffnet lassen. Im Wesentlichen habe ich eine Just In Time-Eigenschaft, die beim ersten Aufruf eine Verbindung öffnet und dann auf Page.Unload (..) überprüft, ob eine db-Verbindung jemals geöffnet war, und sie dann schließen, falls dies der Fall war. Da es nur eine Sekunde dauert, war ich der Meinung, dass es nicht viel anders ist, als es sofort zu schließen.

Ist das ok? Oder sollte es nach jedem Gebrauch noch geschlossen sein?

Vielen Dank im Voraus.

+0

Meinst du, dass die Verbindung zwischen den Post-Backs offen gehalten wird? – MusiGenesis

+0

Nein, die DB-Verbindung ist in Page.Load (...) oder später geöffnet und dann im Page.Unload (...) -Ereignis geschlossen. –

+0

Ich werde meine Antwort bearbeiten, danke. – MusiGenesis

Antwort

1

Es ist nicht ideal, aber ich würde meine Anwendung nicht darüber neu schreiben.Wenn Ihre Seite nicht viel Zeit in verschiedenen Methoden verbraucht, sollte der gesamte Seitenlebenszyklus schnell ausgeführt werden. In der Praxis kann es nur bedeuten, dass Ihr Verbindungsobjekt einige Millisekunden länger geöffnet ist, als es sonst der Fall wäre. Das könnte in einigen Szenarien von Bedeutung sein, aber es klingt nicht so, als wäre es in Ihrem Fall.

+0

Page.Load (..) öffnen, Page.Unload (..) schließen. –

+0

Nur was ich denke, aber ich denke da sind zu viele Puristen hier. –

+4

Puristen sind wie Ausbilder in West Point (der Akademie der US-Armee) - viel von dem, was sie sagen, ist schnell vergessen, wenn die Kugeln zu fliegen beginnen. – MusiGenesis

2

Ja, es ist in Ordnung.

Das Schließen der Verbindung so bald wie möglich ist eine bewährte Methode zum Verhindern verwaister offener Verbindungen, aber wenn Sie sicher sind, dass die Verbindung geschlossen ist, ist nichts daran falsch.

+0

Niemals eine Verbindung offen halten. Die Anwendung wird niemals skaliert, da Sie Ressourcen verwenden, wenn Sie sie nicht benötigen. Verbindungspooling ist etwas, das vor langer Zeit herausgefunden wurde. – chilltemp

+1

Komm schon! Dies ist eine echte App mit einem echten Problem in einer realen Welt, und er sagt, dass die App nie mehr als 100 Benutzer wachsen wird. –

3

Was passiert, wenn die Seite vor dem Ereignis Page.Unload abstürzt? Sie haben eine geöffnete Verbindung. Für mich ist es besser, die Verbindung so schnell wie möglich zu schließen.

7

Nein, es ist nicht OK.

Wenn Ihre Anwendung jemals wachsen oder skalieren muss, sollten Sie dieses Problem beheben. Wenn Sie diese Verbindung offen halten, reduzieren Sie Ihre Skalierbarkeit. Denken Sie daran, dass offene Verbindungen Speicher auf dem Server belegen, Speicher auf dem Client, geöffnete Sperren, usw.

+0

Dank Scott, wird diese besondere App nie mehr als 100 Benutzer skalieren. –

1

Seite stürzt ab? Dies ist, was zu verwenden und schließlich für

sind, sagte, aus Gründen der DB-Leistung (dh Skalierung) * ist es am besten, Verbindungen so kurz wie möglich geöffnet nur zulassen, dass Sie nicht offen offen öffnen möchten schließen öffnen der Nähe zur schnellen sequentiellen und berechenbaren Arbeit

* ich so früh von einem Mentor wurde gesagt, in meiner Karriere, ich muß sagen, ich habe das selbst nicht wirklich getestet, aber es klingt richtig theoretisch

+0

Verbindungspooling hilft bei dem Szenario, in dem Sie viele Verbindungen öffnen und schließen. –

+0

Ich glaube das Problem für John ist, dass seine Architektur aus welchen Gründen auch immer die Verwendung von/finally ausschließt, weil open in PageLoad und PageUnload ist. – Ted

+0

Aber ich würde sagen, das ist ein grundlegendes Design-Problem - es widerspricht der Aufrechterhaltung der Verbindungsdauer so kurz wie möglich – annakata

2

Jeden anständiger ASP. Die NET-App verwendet heutzutage das Verbindungs-Pooling, und ein Pool ist im Grunde eine Menge offener Verbindungen. In Ihrem Fall würde dies bedeuten, dass die Verbindung, an der Sie sich befinden, "besetzt" ist und nicht für andere Anfragen verwendet werden kann.

Soweit ich sehe, wäre es ein Skalierbarkeitsproblem, abhängig von der Zeit, die Ihre Seite für die Arbeit/das Rendern benötigt. Wenn Sie nur 100 Benutzer erwarten, wie Sie sagen, dann ist das wahrscheinlich kein Problem - es sei denn, es sind 100 Req/Sek.

Aus technologischer Sicht ist es OK. Soweit ich mich an die meisten Client-Server-Anwendungen (Web- und Nicht-Web-Anwendungen) erinnere, einschließlich klassischem ASP-Code, der so funktioniert, deklariere ich beispielsweise eine Verbindung für die gesamte Seite und arbeite damit.

1

Natürlich können Sie halten sie offen, aber nein nein. Schließe es nach dem Gebrauch in den endgültigen Blöcken. Eine faire Abwägung von "nach jeder einzelnen Verwendung" besteht darin, sie nach jedem Verwendungsblock zu schließen, wenn Sie einen gespeicherten Prozess ausführen, eine Spalte aktualisieren und dann eine andere Zeile löschen möchten, um diese drei zu öffnen/schließen Operationen, vorausgesetzt, sie sind alle in einen Versuch/Fang/schließlich eingewickelt.

+0

"vorausgesetzt, sie sind alle in einem Versuch/fangen/endlich" verpackt - oder wahrscheinlicher und wahrscheinlich besser, ein Versuch/endlich oder Anweisung verwenden. – Joe

1

Sie sollten die Verbindung während der gesamten Lebensdauer der Seite sicher offen halten, wenn Sie mehrere Abfragen gleichzeitig durchführen. Im Allgemeinen verwendet man Verbindungen über viele Seiten hinweg.

1

Ich denke, eine bessere Frage mit viel besser informiertem und produktiverem Feedback wäre möglicherweise ein paar Auszüge aus dem, was Sie tun (Code) und erweitern Sie die Gründe, warum Sie diese Wahl getroffen haben. Es gibt höchstwahrscheinlich eine bessere Lösung, die es nicht erfordert, die Verbindung so lange offen zu halten, aber zumindest aus pragmatischen Gründen könnten Sie ein Feedback darüber erhalten, ob es sich lohnt, sie zu überarbeiten.

In Zukunft möchten Sie sich definitiv vom Datenzugriff in Ihrem Code-Behind entfernen.

1

Ich finde es bequem, die Verbindung offen zu halten, wenn Sie ORM (Open Session in View) verwenden, damit nach einem anfänglichen eifrigen Abruf andere Daten nach Bedarf geladen werden können. Dies funktioniert gut, wenn die Seitenantwortzeiten angemessen sind, um keine Verbindungen zu knüpfen.

Verwandte Themen