Verwaltung der NHiernate-Sitzung in Asp.Net
Autor:Eve Cole
Aktualisierungszeit:2009-06-30 16:46:38
Eine Sitzung in NHibernate scheint nach meinem Verständnis einer Datenbankverbindung zu entsprechen. Da es auch über Open/Close-Methoden verfügt, habe ich den Quellcode von NHibernate nicht studiert. Ich frage mich, ob dieses Verständnis falsch ist. Ich habe viel über die Sitzungsverwaltung im Internet gesucht. Die meisten davon sind OpenSession(), wenn ich Datenbankoperationen benötige, und CloseSession() nach der Operation ist ein bisschen ähnlich wie zu Beginn des Erlernens von ADO.NET. ) das Connection-Objekt und dann Close(), nachdem die Daten verarbeitet wurden. Dies bringt jedoch einen Nachteil mit sich, da häufiges Umschalten der Connection Systemressourcen verbraucht. Ich erinnere mich, als ich zuvor eine Dateneingabeschnittstelle erstellt habe, weil diese Eingabeschnittstelle viele Datenelemente hatte und viele DropDownLists benötigt wurden, um Daten in der Datenbank zu lesen und zu binden.
Auf diese Weise müssen im Page_Load der Seite die Methoden der entsprechenden Objekte einzeln aufgerufen werden, um die Datenbindung DropDownList aus der Datenbank abzurufen. Da die Methoden dieser Objekte von uns unabhängige Verbindungen verwenden, haben sie alle ihre eigenen eigenes Öffnen und Schließen der Verbindung. Daher dauert das Öffnen dieser Seite sehr lange und ist relativ langsam. Später haben wir die Daten, die an die DropDownList gebunden werden mussten, in einem DataSet verarbeitet und die DataTable im DataSet an die DropDownList gebunden. Auf diese Weise ist nur ein Öffnen/Schließen der Verbindung erforderlich. Die Seite ist viel schneller.
Daher halte ich die oben beschriebene Sitzungsverwaltungsmethode für nicht sehr angemessen.
Später habe ich mir seine Sitzungsverwaltung im Open-Source-Projekt Cuyahoga angesehen und er hat das Modell „Sitzung pro Anfrage“ verwendet.
Das wörtliche Verständnis besteht darin, dass für jede Anfrage eine Sitzung erstellt wird, bis die Anfrage zerstört wird. Anschließend wird die Sitzung geschlossen.
Cuyahogas Ansatz unterscheidet sich ein wenig von der Sitzung pro Anfrage, da er für jede Anfrage ein CoreRepository-Objekt erstellt. CoreRepository ist die Klasse von Datenverarbeitungsdiensten, die das System benötigt.
Was er tat, war, zuerst HttpModule (NHSessionModule) zu erstellen, um CoreRepository-Objekte zu erstellen und CoreRepository-Objekte wie folgt zu zerstören:
private void Context_BeginRequest(object sender, EventArgs e)
{
// Erstellen Sie das Repository für Core-Objekte und fügen Sie es dem aktuellen HttpContext hinzu.
CoreRepository cr = neues CoreRepository(true);
HttpContext.Current.Items.Add("CoreRepository", cr);
}
private void Context_EndRequest(object sender, EventArgs e)
{
// NHibernate-Sitzung schließen.
if (HttpContext.Current.Items["CoreRepository"] != null)
{
CoreRepository cr = (CoreRepository)HttpContext.Current.Items["CoreRepository"];
cr.CloseSession();
}
}
Auf diese Weise wird das CoreRepository-Objekt bei jeder Anforderung automatisch erstellt. Wenn die Anforderung abgeschlossen ist, kann CloseSession () verwendet werden, um das CoreRepository-Objekt über HttpContext.Current.Items["CoreRepository"] im Programm abzurufen.
Auf diese Weise wird die Sitzung in NHibernate in getarnter Form verwaltet und das „Session-per-Request“-Modell erreicht.
Ausführliche Erklärung: Initialisieren Sie die Nhibernate-Sitzung durch Implementierung von IHttpModule
Verglichen mit der oben genannten Methode, bei der für jeden Vorgang eine Sitzung erstellt werden muss, sollte diese Methode die Leistung und Geschwindigkeit erheblich verbessern.
Dann dachte ich, jede Anfrage erzeugt eine Sitzung. Können wir auch einen Sitzungspool wie den Verbindungspool erstellen?
Anstatt bei jeder Anfrage direkt eine Sitzung zu erstellen, wird die bereits erstellte Sitzung aus unserem Sitzungspool übernommen. Ist das nicht effizienter? !
http://maplye.cnblogs.com/archive/2006/06/26/435683.html