5 Stimmen

Java + MySQL Behandlung von Integritätsverletzungen

Ich schreibe ein Java-Programm mit JDBC (mysql-Datenbank). Wenn ich die Integrität von mysql verletze (z.B. wenn ich versuche, denselben Primärschlüsselwert einzufügen), fange ich SQL-Ausnahme. Sollte ich es so schreiben, dass es nie passieren kann (z.B. zuerst eine boolesche Funktion, die prüft, ob der Wert des Primärschlüssels nicht bereits in der DB ist und dann insert aufruft), oder ist es in Ordnung, es einfach durch eine Ausnahme zu behandeln? Beispiel:

catch (SQLException ex) {ex.printStackTrace(); showSomeErrorDialog(); }

4voto

BalusC Punkte 1034465

Es gibt in der Tat zwei Möglichkeiten, dies zu erreichen:

  1. Test, ob ein Datensatz existiert, bevor er --innerhalb derselben Transaktion--eingefügt wird.

  2. Bestimmen Sie, ob SQLException#getSQLState() der gefangenen SQLException beginnt mit 23 was einen Verstoß gegen die Beschränkung gemäß der SQL-Spezifikation . Es können nämlich mehr Faktoren als "nur" ein Verstoß gegen eine Einschränkung die Ursache sein. Sie sollten nicht jede SQLException als einen Verstoß gegen eine Beschränkung.

    public static boolean isConstraintViolation(SQLException e) {
        return e.getSQLState().startsWith("23");
    }

Ich würde mich für die erste Variante entscheiden, da sie semantisch korrekter ist. Es handelt sich in der Tat nicht um einen außergewöhnlichen Umstand. Sie haben nämlich wissen dass es möglicherweise dazu kommen wird. In einer stark konkurrierenden Umgebung, in der Transaktionen nicht synchronisiert werden (entweder aus Unwissenheit oder um die Leistung zu optimieren), kann es jedoch zu Fehlern kommen. In diesem Fall möchten Sie vielleicht stattdessen die Ausnahme ermitteln.

Abgesehen davon sollten Sie normalerweise keine Einschränkungsverletzung bei einer Primärschlüssel . In gut konzipierten Datenmodellen, die technische Schlüssel als Primärschlüssel verwenden, sind diese normalerweise von der Datenbank selbst zu verwalten. Sollte das Feld nicht ein eindeutiger Schlüssel ?

2voto

Valentin Rocher Punkte 11493

Es gibt zwei mögliche Antworten:

  • wenn Sie wissen, dass Ihre Anwendung so konzipiert ist, dass dieses Verhalten vermieden wird, verwenden Sie die Ausnahme
  • Wenn Ihre Anwendung diese Fehler häufig machen kann, sollten Sie einen Test durchführen.

1voto

Bipul Punkte 1564

Wie andere bereits erwähnt haben, gibt es zwei mögliche Ansätze, einer davon ist das Testen und anschließende Einfügen/Aktualisieren, andernfalls die Behandlung der SQL-Ausnahme. Diese beiden Ansätze haben ihre Nachteile:

  • Der Vorbehalt bei "Testen vor dem Einfügen" ist, dass jede Transaktion zusätzliche Abfragen mit sich bringt, die die Leistung beeinträchtigen. Dies ist insbesondere dann ein größeres Problem, wenn die Anzahl der fehlerhaften Transaktionen gering ist.
  • Der Vorbehalt für "Evaluating SQL Exception" ist, dass solche Ausnahmemeldungen sehr datenbankspezifisch sind. Diese Meldungen geben in den meisten Fällen nicht spezifische Informationen, die über die Angabe einer Beschränkungsverletzung hinausgehen.

Ich werde also einen Ansatz vorschlagen, der eine Mischung aus beidem .

  • Führen Sie den Test nicht vor dem Einsetzen durch.
  • Lassen Sie die Datenbank ein Ausnahme auslösen.
  • Catch SQL Exception.
  • Im Ausnahmefluss (catch Block), führen Sie zusätzliche Abfragen durch, um sehr spezifische Fehlermeldungen zu bilden, die Kunden anzugeben, was genau fehlgeschlagen ist (eindeutiger Schlüssel, Primärschlüssel, Fremdschlüssel, bestimmte Spalten usw.).

Dies erfordert zwar ein paar zusätzliche Codezeilen, aber es verbessert definitiv die Leistung und erzeugt freundliche Fehlermeldungen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X