Frage

Zur Zeit, was ich für das Transaktionsmanagement tue, ist:

Connection connection = getConnection();
connection.setAutoCommit(false);
updateTableX ( connection, ... );
updateTableY ( connection, ... );
connection.commit();
closeConnection();

Ich möchte wissen, ob es möglich ist, das Schließen der Verbindung in meinem ‚updateTableX‘ Verfahren zu vermeiden. Denn wenn jemand versehentlich die Verbindung geschlossen wird, dann wird meine updateTableY nicht die Verbindung errichtet werden und es wird die Ausnahme ausgelöst.

War es hilfreich?

Lösung

Just Disziplin. Im Allgemeinen sollten Methoden nicht versuchen, die Verantwortung für die Schließung Dinge in sie als Parameter übergeben zu nehmen -. Mit Ausnahme von Situationen, in denen Sie ein neues Objekt erstellen, einen vorhandenen zu wickeln

Die Art und Weise das Schließen der Verbindung in updateTableX zu vermeiden, ist nur sicher, dass Sie einen Anruf nicht platziere in den Code close(). Das ist nicht anders als jeder anderer Fehler wirklich. Wie stoppen Sie updateTableX aus willkürlich eine andere Tabelle zu aktualisieren, oder eine Ausnahme zu werfen, oder irgendetwas anderes zu tun, es nicht gemeint ist? Code-Reviews, Unit-Tests, Integrationstests, manuelle Tests etc ...

Ich meine, Sie könnte eine Connection Implementierung schreiben, die eine andere Verbindung wickelt und Proxies alle Methoden durch außer close() aber es klingt wie eine Verschwendung von Zeit - wenn Sie don‘ t vertrauen Sie nicht beteiligten Entwickler die Verbindung zu schließen, vertrauen Sie ihnen Recht, den Rest des Codes zu bekommen?

Andere Tipps

Wie Jon sagte, wenn Sie wirklich forbit anrufen möchten close() Sie einen Dekorateur Implementierung schreiben könnte, die zu Ihrem „echten“ Connection Objekt weiterleitet. Ich habe keinen Code Beispiel posten, weil die Connection Schnittstelle zu groß ist. Mit modernen IDEs jedoch ist es kein Problem, den Code zu generieren.

Rezept (vorausgesetzt, Sie verwenden Eclipse):

  1. Erstellen Sie eine Klasse, die Connection implementiert, aber nicht implementieren die Methoden
  2. Erstellen Sie ein Feld private Connection delegate;
  3. Wählen Sie die Feldnamen -> Quelle (Menü) -> „Gene Constructor mit Feldern“ -> sicherstellen, dass das Feld ausgewählt ist, und drücken Sie OK
  4. Wählen Sie die Feldnamen -> Quelle (Menü) -> "Gene Methoden Delegieren ..." -> prüft jede Methode auf Ihnen Feld
  5. ändern Sie die Implementierung der close() Methode eine UnsupportedOperationException zu werfen

Doch wie Jon sagte, würde ich wirklich darüber nachdenken, so etwas zu tun. Und vielleicht verwenden Sie nur ein Object-Relational-Mapper (zum Beispiel Hiberate ) alle Ihre Datenbank-Zugriffslogik zu kapseln. Ein weiterer sehr hilfreich Rahmen in diesem Bereich ist Frühling , vor allem, wenn Sie über Connection und DataSource Umgang pflegen wollen nicht .

(Ich bin nicht vertraut mit Java speziell)

Angenommen, Sie irgendeine Art von Datenbank verwalten Objekt haben, könnten Sie haben es sicherstellen, dass es angeschlossen ist, bevor es irgendwelche Operationen versucht.

Sie könnten versuchen, den Zugang zu beschränken, die Verbindung zu schließen, aber wie würden Sie entscheiden, ob es geschlossen werden soll, oder wenn er „zufällig“ ist (aber Sie definieren das)?

Das glaube ich nicht, was Sie fordern möglich ist.

Sie können technisch eine Kopie Ihres Connection-Objekt machen, aber dann, was passiert, wenn die Client-Programmierer nicht , um die Verbindung schließen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top