2009-05-28 4 views
3

Ich habe eine Million Beispiele von DAOs gesehen, und größtenteils implementieren sie alle Ihre grundlegenden CRUD-Operationen für einzelne Entitäten, mit vielleicht ein paar Methoden, die Listen zurückgeben (z.B. List getCustomers()).Sind Methoden, die mehrere Entitäten aktualisieren, normalerweise nicht Teil eines DAO?

Allerdings habe ich noch nie ein Beispiel gesehen, in dem es eine Methode gibt, die mehrere Entitäten aktualisiert, löscht oder erstellt, wie: void update (List).

Sind Methoden, die mehrere Entitäten aktualisieren, normalerweise nicht Teil eines DAO, oder werden sie in Beispielen nur selten verwendet? Ich habe eine Anforderung, in der ich einige Stapel einfügen muss, und den Aufruf von myDAO.create() hundert Mal ist nicht sehr effizient.

Ich möchte nur sicherstellen, dass ich nicht etwas vermisse, bevor ich weitermachen und tun, was offensichtlich erscheint.

Antwort

0

Ich denke, die Beispiele verwenden es nicht oft. Meine DAOs verfügen über Methoden, um auf einzelne Entitäten und Datensatzsammlungen zuzugreifen, sie zu erstellen und zu aktualisieren.

2

Ich finde, dass Batch-Updates in der Regel mit Tools vom Datenbankanbieter durchgeführt werden.

Ich stimme zu, dass die DAOs, die ich gesehen habe, in der Regel keine Methoden zum Erstellen/Aktualisieren/Löschen überladen haben, um Liste zu nehmen, aber es gibt keinen Grund, warum sie nicht können.

Der eine Gedanke, der mich auf den Punkt bringt, ist, dass DAOs keine Transaktionen besitzen, wenn ich sie schreibe. Sie können nie wissen, wo sie Teil einer größeren Arbeitseinheit sind. Das machen Services.

Mein Rat wäre, die DAOs in Ruhe zu lassen und eine separate Service-Schicht die Batch-Operationen zu besitzen. Dienste besitzen die Transaktionslogik. Es ist auch ein guter Ort, um Logik für das "Chunking" eines großen Updates in Stücke zu integrieren. Dadurch können Sie den Stapel überprüfen und die Größe Ihrer Rollback-Protokolle verwalten.

+0

Hm, es scheint, als müsste ich in meiner DAO noch eine Methode haben, die eine Liste aufnehmen kann, damit ich ein korrektes Batch-Update implementieren kann. Ich könnte den Stapel immer noch in meiner Service-Methode aufteilen und alles unter der gleichen Transaktion ausführen, ja? – Boden

+0

Nein, ich schlage vor, dass DAO immer noch eine einzelne Objektinstanz benötigt, und der Dienst würde DAO in einer Schleife aufrufen (oder Schleifen, wenn Sie es "chunking"). Die Servicemethode wäre eine einzelne Arbeitseinheit, die die Transaktion besitzen würde. Der Dienst könnte die Transaktion auch stapelweise durchführen, um den Netzwerkverkehr zu reduzieren. – duffymo

+0

Wie würde das funktionieren? Wenn ich zum Beispiel JDBC verwenden würde, wäre ich nicht in der Lage, executeBatch im Dienst zu verwenden ... Ich würde im Grunde eine ganze Reihe von regelmäßigen Updates begehen. – Boden

0

void update(List) sollte genauso funktionieren wie void update(Item), nur die List man würde mehrere Elemente aktualisieren. Wenn nicht, sollte es sein, es sei denn, es gibt ganz bestimmte Gründe, warum nicht. Der Overhead beim Aufruf einer Methode ist kein Problem, wenn sie dasselbe tun.

Zum Beispiel Anruf update(Item) 1000 mal vs Anruf update(List) 1 und es tut das gleiche wie update(Item) nur ein 1000 Mal bedeutet, dass es sehr wenig Leistungsunterschied sein wird.

+0

Wenn ich eine Update (List) -Methode implementieren würde, würde ich nicht ein Update (Item) für jedes Element in der Liste tun. Ich würde alle Batch-Update-Methoden verwenden, die meine Datenbank-Ebene bietet. Der Overhead von 1000 separaten Updates kann viel höher sein als ein einzelnes Batch-Update auf dieser Ebene. – Boden

Verwandte Themen