Ich bin neu bei NHibernate und habe Schwierigkeiten, es für meine aktuelle Website einzurichten. Diese Website wird auf mehreren Webservern mit einem Datenbankserver ausgeführt, was zu einigen Problemen mit der Nebenläufigkeit führt. Die Website wird schätzungsweise etwa 50.000 registrierte Benutzer haben, und jeder Benutzer wird eine Profilseite haben. Auf dieser Seite können andere Benutzer einen anderen Benutzer 'liken', ähnlich wie bei Facebook. Hier tritt das Problem der Nebenläufigkeit auf.
Ich dachte daran, den Second-Level-Cache zu verwenden, wahrscheinlich mit dem MemChached-Provider, da ich mehrere Webserver habe. Was ist der beste Weg, eine solche 'Like'-Funktion mit NHibernate zu implementieren? Ich dachte an drei Optionen:
- Verwenden Sie eine einfache Count()-Abfrage. Es wird eine Tabelle 'User_Likes' geben, in der jede Zeile einen Like von einem Benutzer zu einem anderen repräsentiert. Um die Anzahl der Likes anzuzeigen, würde ich einfach die Anzahl der Likes für einen Benutzer abfragen, was in der Datenbank als einfaches
SELECT COUNT(*) FROM USER_LIKES WHERE ID = x
oder so etwas übersetzt würde. Allerdings denke ich, dass dies mit einer großen Leistungseinbuße verbunden wäre, da jedes Mal, wenn ein Benutzer eine Profilseite besucht und einen anderen Benutzer mag, die Anzahl der Likes neu berechnet werden müsste, zweiter Cache-Level hin oder her. - Verwenden Sie eine zusätzliche
AnzahlDerLikes
-Spalte in der Benutzertabelle und inkrementieren/dekrementieren Sie diesen Wert, wenn ein Benutzer einen anderen Benutzer mag oder nicht mag. Allerdings habe ich dabei Probleme mit der Nebenläufigkeit. Mit einer einfachen for-Schleife habe ich es getestet, indem ich einen Benutzer auf zwei Servern jeweils 1000 Mal gemocht habe, und das Ergebnis in der Datenbank waren insgesamt etwa 1100 Likes. Das ist ein Unterschied von 900. Ob ein realistischer Test oder nicht, dies ist natürlich keine Option. Jetzt habe ich mir optimistisches und pessimistisches Sperren als Lösung angesehen (ist es das?), aber mein aktuelles Repository-Muster ist im Moment leider nicht geeignet, dies zu verwenden, also bevor ich das behebe, würde ich gerne wissen, ob das der richtige Weg ist. - Wie 2, aber mit benutzerdefiniertem HQL und dem Schreiben des Update-Statements selbst, etwas in der Art von
UPDATE Benutzer SET AnzahlDerLikes = AnzahlDerLikes + 1 WHERE id = x
. Das sollte mir keine Nebenläufigkeitsprobleme in der Datenbank bereiten, oder? Allerdings bin ich mir nicht sicher, ob ich Dateninkonsistenzen auf meinen mehreren Servern aufgrund des Second-Level-Cachings haben werde.
Also... Ich brauche wirklich einen Rat hier. Gibt es eine andere Option? Das fühlt sich nach einer häufigen Situation an und NHibernate muss das doch bestimmt auf elegante Weise unterstützen. Ich bin neu bei NHibernate, daher ist eine klare, ausführliche Antwort sowohl notwendig als auch geschätzt :-) Danke!