2017-02-03 5 views
1

Stellen Sie sich vor mir den folgenden Code habe einen Datensatz in Apache Jena Datenbank (TBD) zum Einfügen:Wie werden Schreibfehler in Apache Jena behandelt?

private fun createPersonLogic(ds: Dataset, email: String, nick: String) { 
    ds.begin(ReadWrite.WRITE) 
    val model = ds.defaultModel 

    val uuid = UUID.randomUUID() 
    val uri = "http://mycompany.com/data/p-${uuid}" 
    val person = model.createResource(uri) 
    person.addProperty(VCARD.EMAIL, email) 
    person.addProperty(VCARD.N, 
      model.createResource() 
        .addProperty(VCARD.NICKNAME, nick)) 
    ds.commit() 
    ds.end() 
} 

Was ist der richtige Weg, um Fehler bei der Ausführung von model.createResource und ds.commit zu handhaben - unten wie im Codefragment oder anders?

private fun createPersonLogic(ds: Dataset, email: String, nick: String) { 
    try { 
     ds.begin(ReadWrite.WRITE) 
     val model = ds.defaultModel 

     val uuid = UUID.randomUUID() 
     val uri = "http://mycompany.com/data/p-${uuid}" 
     val person = model.createResource(uri) 
     person.addProperty(VCARD.EMAIL, email) 
     person.addProperty(VCARD.N, 
       model.createResource() 
         .addProperty(VCARD.NICKNAME, nick)) 
     ds.commit() 
    } 
    catch (throwable:Throwable) { 
     // react to the error 
    } 
    finally { 
     ds.end() 
    } 
} 

Antwort

0

Wie konnten wir möglich wissen, was in Ihre Anwendung auf einen solchen Ausfall ist die richtige Antwort ?!

Ernsthaft: es ist Ihr Projekt, Ihre Anwendung, Ihre Anforderungen. Sie müssen klar sein, was solche Probleme für Sie bedeuten.

Dennoch eine „generische“ ist:

  1. Feedback des Systems an den Benutzer geben - offenbar einige sehr Kern Betrieb nur fehlgeschlagen. Sie können diese Operation nicht fortsetzen. Sie könnten sogar ein Rollback benötigen.
  2. Es gibt Muster um Fehlersituationen (wie die circuit breaker), die eine Anleitung für solche Probleme geben. Mit anderen Worten: Wenn Ihre Datenbank sich weigert, Daten zu schreiben, könnte etwas wichtig gebrochen werden. Du musst wahrscheinlich damit umgehen; über den Rahmen dieser einen Operation, die in diesem Fall fehlgeschlagen ist.
+0

Die Frage ist ** nicht ** anwendungsspezifisch. Es gibt allgemeine Regeln für die Fehlerbehandlung. Wenn Sie eine Datei lesen oder in eine Datei schreiben, müssen Sie einen Standardsatz von Ausnahmen (E/A, Datei nicht gefunden) abfangen und die Streams sowohl in Erfolgs- als auch in Fehlerfällen schließen. Wenn Sie einen Datensatz mit JDBC in eine relationale Datenbank einfügen, müssen Sie die Transaktion im Falle eines Fehlers zurücksetzen und die Anweisung schließen. Diese Dinge sind generisch und hängen nicht von der Anwendung ab. Ich suche eine etablierte Best Practice für Apache Jena. –

+1

Rufen Sie 'ds.abort()' auf (das 'ds.end()' erledigt das für Sie - es bricht jede nicht übergebene Transaktion ab). Die Datenbank klärt auf. Ein Datenbankfehler ist schwerwiegend (z. B. nicht genügend Festplattenspeicher, JVM OOME) und muss betrachtet werden, aber die Daten sind intakt, nur nicht aktualisiert. Der Rest ist ein Anwendungsproblem. – AndyS

+0

@AndyS Bedeutet dies, dass mein Code persistenzbezogene Fehler korrekt behandelt? –

Verwandte Themen