Nicht blockierende ORM-Probleme

9

Ich habe eine Frage zu SO gestellt und festgestellt, dass es für mein Lieblingswebframework keine nicht blockierenden ORMs gibt. Mit nicht blockierend meine ich ein ORM mit Rückrufunterstützung für das asynchrone Abrufen. Das ORM würde mit einem Rückruf oder einem solchen Rückruf versorgt, der ausgeführt werden soll, wenn Daten empfangen wurden.

Ich möchte eine erstellen, habe aber einige Fragen, die mich daran hindern, mit der Entwicklung zu beginnen:

  • Welche Probleme können bei der Entwicklung von ORM auftreten?
  • Erhöht die Unterstützung des nicht blockierenden Abrufs die Komplexität eines ORM erheblich?
  • Warum gibt es so wenige nicht blockierende ORMs?

Update: Es sieht so aus, als müsste ich meine Frage verbessern. Wir haben Lösungen, mit denen wir Daten bereits auf nicht blockierende Weise empfangen können, und ich glaube, dass die meisten Unternehmen, die solche Lösungen verwenden, Raw-SQL verwenden. Wir möchten eine allgemeinere Lösung schaffen, die wir in zukünftigen Projekten wiederverwenden können. Auf welche Schwierigkeiten könnten wir stoßen?

Update 2: Bevorzugte Sprache ist Python, aber ich interessiere mich für Prinzipien. Diese Frage ist eigentlich für mich, da ich mir Plattformen ansehen werde, die bereits nicht blockierendes ORM haben.

Nikolay Fominyh
quelle
2
Was ist ein "nicht blockierendes ORM"? Wie können Sie die Daten anzeigen, bevor Sie sie erhalten?
Robert Harvey
6
@ RobertHarvey: Asynchrones Abrufen klingt eigentlich ziemlich gut. Das ORM würde mit einem Rückruf oder einem solchen Rückruf versorgt, um zu "aktivieren", wenn Daten empfangen wurden. Andernfalls muss Ihr ORM in einen separaten Thread aufgeteilt werden, um die Reaktionsfähigkeit der Benutzeroberfläche zu gewährleisten.
Marjan Venema
@ MarjanVenema, ja, ich möchte ORM mit Rückrufunterstützung.
Nikolay Fominyh
1
Warum also nicht einfach asynchrone Rückrufe mit Ihrem bevorzugten synchronen ORM verwenden? stackoverflow.com/q/1239035
Robert Harvey
@ RobertHarvey, weil synchrones ORM den asynchronen Server blockiert.
Nikolay Fominyh

Antworten:

2

Welche Probleme können bei der Entwicklung von ORM auftreten?

Sie müssen sich mit der Liste der Probleme befassen, die zur Überbrückung der Nichtübereinstimmung der objektrelationalen Impedanz erforderlich sind , sowie mit den von jedem RDBMS-Anbieter bereitgestellten SQL-Eigenheiten. Je weiter fortgeschritten Ihre Anforderungen sind, desto schlimmer werden Ihre Probleme in dieser Abteilung: Beispielsweise unterscheidet sich SQL, das Sie zur Implementierung von Ergebnis-Paging generieren, zwischen Oracle, SQL Server und MySQL erheblich. Glücklicherweise unterscheidet sich dies nicht zwischen blockierenden und nicht blockierenden ORM-Implementierungen. Wenn es also ein Open-Source-ORM für Python gibt, können Sie es stark ausleihen, um fast alle diese Probleme zu lösen.

Erhöht die Unterstützung des nicht blockierenden Abrufs die Komplexität eines ORM erheblich?

Das größte Problem, mit dem Sie konfrontiert werden, ist, dass die Verbindungsbibliothek für den Zugriff auf das RDBMS selbst blockiert wird. Dies ist ein weiterer Unterschied, den Sie ansprechen müssen. Das Verwalten der für Ihre Benutzer unsichtbaren Threads ist die zusätzliche Herausforderung für Sie. Darüber hinaus wäre das Laden von Abhängigkeiten bei Bedarf eine Herausforderung, da der Vorgang von den Benutzern Ihres Frameworks als synchron wahrgenommen wird. Schließlich erwarten sie normalerweise keine Benachrichtigung darüber, wann der Zugriff auf eine Sammlungseigenschaft ihres Objekts in Ordnung ist.

Warum gibt es so wenige nicht blockierende ORMs?

Ich kann nur über diesen letzten Punkt spekulieren, aber ich denke, das hat mit der geringen Nachfrage nach solchen Frameworks zu tun: Sie können nicht blockierendes ORM teilweise simulieren, indem Sie Ihrem Anwendungscode nach Bedarf eine weitere Threading-Ebene hinzufügen und die reguläre Blockierung beibehalten Überall sonst scheint es suboptimal zu sein, ein spezielles Framework dafür zu entwickeln.

dasblinkenlight
quelle
Ich bin mir nicht sicher, ob die Antwort auf diese Frage besser sein kann. Vielen Dank.
Nikolay Fominyh
6

Sie haben nicht gesagt, welche Sprache Sie verwenden, daher empfehle ich Node.js und ein ORM dafür: Node ORM , alles im Knoten ist asynchron, das ist nicht anders.

gbjbaanb
quelle
Frage aktualisiert.
Nikolay Fominyh