Lohnt es sich wirklich, agnostisch bei der Umsetzung zu bleiben?

22

Ich habe ein Projekt, an dem ich gerade arbeite und das Tomcat, Spring 4, Spring Security, MySQL und JPA mit Ruhezustand verwendet.

Ich habe JPA unter dem Gesichtspunkt ausgewählt, dass es wahrscheinlich ist, die zugrunde liegende Implementierung von ORM-Anbietern nahtlos oder zumindest weniger schmerzhaft auszutauschen. Ich würde sagen, dass dies die mentale Verwendung der Spezifikation über die Implementierung (JAX-RS) ist der Standardstandpunkt der Java-Entwicklergemeinschaft.

Ich bin gespannt, ob sich das wirklich lohnt. Ich bin sicher, wenn ich Hibernate direkt verwenden würde, würde ich etwas an Leistung gewinnen, da ich Funktionen verwenden könnte, die nicht Teil der JPA-Hauptspezifikation sind.

Ein Teil meiner Sorge kommt von der Idee von YAGNI. Ich programmiere im Wesentlichen auf eine bestimmte Art und Weise (mit JPA anstelle von Hibernate), damit ich irgendwann in der Zukunft meine ORM-Implementierung austauschen kann. Ich bezweifle sehr, dass dies jemals während der gesamten Lebensdauer des Produkts passieren wird, und bin daher im Grunde genommen bemüht, etwas zu tun, von dem ich wahrscheinlich nie profitieren werde.

Was sind deine Gedanken? Lohnt es sich, "an der Schnittstelle zu programmieren", wenn es um Dinge wie JPA geht? Haben Sie jemals eine komplette ORM-Implementierung in einem Produkt ausgetauscht? Konnten Sie jemals die Abstraktion von etwas wie JPA, das sowieso ausläuft, vollständig vermeiden? Ich persönlich habe bereits einen einzigen nativen SQL-Aufruf (um die Datenbanktabellen zu bereinigen), und es gibt Dinge, mit denen ich gerne etwas anfangen möchte, die in die JPA-Spezifikation integriert sind (get / set-Präfixe für Ihre Methoden und der Unterschied zwischen MEMBER OF) / IN, das mich nur an eine zugrunde liegende Implementierung bindet, gibt mir die Möglichkeit, das zu vermeiden.

Jazzepi
quelle
Führen Sie einen Unit-Test durch? Das Austauschen von Implementierungen bedeutet nicht unbedingt das fertige Produkt.
MrDosu

Antworten:

26

damit ich irgendwann in der Zukunft meine ORM-Implementierung austauschen kann. Ich bezweifle sehr, dass dies jemals während der gesamten Lebensdauer des Produkts passieren wird, und bin daher bestrebt, etwas zu tun, von dem ich wahrscheinlich nie profitieren werde

Nach meiner Erfahrung wird ein typisches Unternehmensprojekt niemals ausgetauscht:

  1. Datenbank
  2. ORM
  3. Sprache

Ich kenne die Zahlen nicht, aber der Prozentsatz der 2-Tier-Apps, die ich implementiert und dann geändert habe, würde wahrscheinlich weniger als 10% betragen. In diesem Fall kommt es nur selten vor und dies geschieht normalerweise innerhalb der ersten zwei bis drei Monate des Projekts, wenn sich die Benutzer noch im Ermittlungsmodus befinden. Die meisten mir bekannten Systeme laufen noch 8-10 Jahre später auf ihren ursprünglichen Plattformen.

Möchten Sie wissen, wovon ich mehr gesehen habe, als ein ORM auszutauschen? Vollständiges Entfernen des ORM, um aufgrund von Leistungsproblemen auf SQL zuzugreifen. Also egal was passiert, in diesem Fall werden Sie Sachen umschreiben.

Was die Implementierung betrifft, ist es ein Mythos. Es läuft wirklich darauf hinaus, sich zu beschweren. Mein Ansatz ist es also, die Datenschicht einzubeziehen. Machen Sie es zu einem erstklassigen Teil Ihrer Sprache und Ihres Designs. Es sorgt für glücklichere und erfolgreichere Projekte.

Codenheim
quelle
3
Völlig einverstanden, dies ist auch die Grundlage für die meisten Probleme, die ich mit Hibernate im Allgemeinen habe - es gefährdet die generierte SQL, um das Auslagern der Datenbank zu erleichtern. Es wird auch ein "Zugriff" ausgeführt, indem angenommen wird, dass dies der beste Ort zum Speichern eines Tabellencaches ist, was bei IMO nur selten der Fall ist. Es gibt einen Fall für Hibernate, in dem SQL-Tuning-Module, die HQL in Oracle, MySQL, SQL Server usw. umwandeln, SQL optimiert werden und keine dummen Dinge mehr tun, die das RDBMS besser kann.
Mcottle
5

lohnt es sich?
Das würde ganz von der Anwendung abhängen.
Wenn Sie eine interne Bewerbung für ein einzelnes Unternehmen schreiben, vergessen Sie diese. Diese Datenbank überlebt die Anwendung um Jahre, möglicherweise Jahrzehnte.
Es sei denn, Sie haben von Anfang an verstanden, dass die Datenbank in naher Zukunft durch etwas anderes ersetzt werden soll.
Wenn Sie es für den Verkauf an Kunden schreiben, die möglicherweise über unterschiedliche Datenbank-Engines verfügen, UND die Anforderungen so sind, dass es mehrere Datenbank-Engines unterstützen soll, ist es dann sinnvoll.

Für die meisten Leute, die Java-Anwendungen schreiben, ist dies weitgehend irrelevant.

jwenting
quelle
+1 für die Erwähnung von Anwendungen, bei denen die Unterstützung mehrerer DBMS eine Funktion ist. Wenn Sie Ihre Anwendung für "Self-Hosting" anbieten (was viele Unternehmenskunden für wünschenswert halten), benötigen Sie diese möglicherweise. Sie können sich jedoch wahrscheinlich immer noch an einen ORM halten.
sleske
4

Aus meiner Erfahrung: Nein, im Falle von JPA / Hibernate lohnt es sich nicht .

Lohnt es sich, "an der Schnittstelle zu programmieren", wenn es um Dinge wie JPA geht?

Es ist, hat aber nichts speziell mit JPA zu tun. Sie können die Schnittstellen des Ruhezustands "programmieren". Hier geht es nicht darum, ein Framework unter einem Standard zu verstecken, sondern um SOLID .

Haben Sie jemals eine komplette ORM-Implementierung in einem Produkt ausgetauscht?

Ja und nein. Eines der Produkte unseres Unternehmens ist teilweise von Hibernate nach jOOQ migriert (was nichts mit JPA zu tun hat). Es war nicht gerade ein "typisches Unternehmensprojekt", das @codenheim erwähnte, so dass ein Austausch möglich war.

Ich sehe keinen Grund, den Ruhezustand mit einem anderen JPA-kompatiblen ORM zu tauschen.

Konnten Sie jemals die Abstraktion von etwas wie JPA, das sowieso ausläuft, vollständig vermeiden?

Nein, es ist unmöglich, da sowohl JPA als auch Hibernate sehr komplex sind. Und Sie müssen sich trotzdem mit Leistungsproblemen und Designfehlern von Hibernate auseinandersetzen.

scriptin
quelle
3

Ich würde sagen, dass es sich lohnt, wenn man das Risiko eingeht, hier konträr zu klingen. Und das ist es nicht.

Das Problem besteht nicht so sehr darin, den ORM- oder Datenbankanbieter als solchen zu wechseln. Es geht eher um die Trennung von Interessen und darum, agil zu bleiben.

Sobald Sie sich auf einige Implementierungsdetails einer Bibliothek verlassen, beginnen Sie, tiefere und tiefere Verstrickungen von Bedenken zu erzeugen.

Wenn Sie wissen, dass sich Ihre ORM-Implementierung im Ruhezustand befindet, durchdringt dieses Wissen die gesamte Architektur Ihrer Anwendung. Und wenn eine neue Technologie auf den Markt kommt, die Hibernate oder JPA so gründlich verdrängt wie Hibernate zuvor, stellen Sie fest, dass die Abhängigkeiten viel tiefer geworden sind, als Sie erwartet hatten.

Es ist viel besser, das gesamte Anliegen, Ihr Modell beizubehalten, aus dem Weg zu räumen, wo der Rest der Anwendung alle Feinheiten des Umgangs mit Datenbanken und Transaktionen und so weiter leicht ignorieren kann. In dieser abgelegenen dunklen Ecke können Sie sich über bestimmte Implementierungsdetails verknoten, wenn Sie möchten - es spielt eigentlich keine Rolle mehr.

Roland Tepp
quelle
1

Das Problem mit der Implementierungsunabhängigkeit ist, dass Sie in Ihrer Zeit als Entwickler so oder so Zeit verschwenden.

Ich habe mehrere Projekte geschrieben, bei denen wir viel Zeit damit verschwendet haben, an eine Schnittstelle zu schreiben, die dann nie auf eine neue Art und Weise verwendet, nie konvertiert und einfach so verwendet wurden, wie sie ist

Ich habe auch eine Menge Zeit damit verschwendet, Software zu konvertieren, von der niemand erwartet hätte, dass sie konvertiert werden müsste.

Die einzige wirkliche Bemerkung, die ich machen muss, ist, dass Ersteres viel weniger schmerzhaft ist.

Jon Geschichte
quelle