Home » 2017

Archiv für das Jahr: 2017

Lambda mit mehreren parametern – Comparator

new Comparator<HealthCheckPosition>(){
    @Override
    public int compare(HealthCheckPosition o1, HealthCheckPosition o2) {
        return DateTimeComparator.getDateOnlyInstance().compare(o1.getInstrument().getRelevantExpirationDate(), o2.getInstrument().getRelevantExpirationDate());
    }
};
   

Als Lambda:

(Comparator<HealthCheckPosition>) (o1, o2) -> DateTimeComparator.getDateOnlyInstance().compare(o1.getInstrument().getRelevantExpirationDate(), o2.getInstrument().getRelevantExpirationDate());

Trap: Multithreading: Create Thread but it has no context

Often a newly created Thread has no access to some context because this is defined in the environment (e.g. Server Container) as being thread local.

Feld-Wert via Reflection setzen

With Spring:

org.springframework.test.util.ReflectionTestUtils#setField(java.lang.Object, java.lang.String, java.lang.Object)

Pure Java:

Person person = new Person();
Class<?> c = person.getClass();
Field f = c.getDeclaredField("name");
f.setAccessible(true);
f.setBoolean(person, "Hans");

PL/SQL für Support-Scripts für DB-Änderungen

Problem:
Dem Produktions-Support eine sequenz von SQL Statements übergeben, bei der der Supporter über die SQL-Statements hinweg IDs propagieren muss?
Dabei verhindern, dass aufs Versehen zu viel gelöscht wird?

Lösung:
PL/SQL-Prozedur erstellen. Diese übernimmt das Propagieren der IDs. Die Gefahr des Vertippens ist vielfach kleiner, denn es muss nur die Prozedur kopiert werden. Diese kompiliert nicht, wenn beim kopieren etwas schief läuft.

Die PL/SQL-Prozedur kann einfach so in die SQLPlus-Konsole kopiert werden.

Links:

Weitere Links:

PLSQL Anfänger-Fallen/Tipps

‚/‘ zum Aktivieren am schluss der Stored Procedure, um diese zu aktivieren

Am schluss der Stored Procedure Definition mus ein auf einer neuern Zeile ein ‚/‘ angefügt werden, um diese im DB System auch zu aktivieren.

PLSQL Stored Procedures aufrufen:

execute meine_stored_procedure(‚parameterwert‘) 

Parameterwert falls String in Hochkommas.

Input parameter von Stored Procedures sind immer ohne Längenangabe

varchar2(100) ist als Input-Parameter einer Stored Procedure falsch. Schreibe stattdessen: varchar ohne Längenangabe. Die Länge wird intern auf ein Maximum gesetzt.

Ouput ist nicht sichtbar!

Das problem ist dass der DBMS-Output nicht eingeschaltet ist. Mache das mit diesem Kommando:

SET SERVEROUTPUT ON

Compilierfehler werden nicht angezeigt

Symptom: Eine Stored Procedure wird kompiliert und einzig und allein diese Fehlermeldung erscheint: ORA-24344: success with compilation error

–> Die Kompilierfehler können angezeigt werden, indem SHOW ERRORS an die zu kompilierende Stored Procedure angefügt wird. Einfach nach dem „END;“ der stored Procedure anfügen, zusammen mit derselbigen markieren und abschicken.

–> StackOverflow-Artikel dazu

Exceptions versus Status Code propagation

Java Exception Handling

Was ist gutes Error-Handling?

Gute Fehlerbehandlung bietet Übersicht, welche Fehlersituationen zu welcher Reaktion führen.

Mögliche Reaktionen bei Fehlern:

  • SW gibt Exception weiter an caller
  • SW erstellt Teilresultate, mit Fehler-Informationen

In allen meinen vergangenen Projekten hat man mit Error-Codes  (Strings) gearbeitet. Es ist dann immer recht schwierig von diesen Error-Code auf deren Verarbeitung zu schliessen.

Wäre es nicht besser, mit Exceptions zu arbeiten, statt mit Fehlercodes? Wäre es nicht besser, für alle Fehlersituationen, die eine bestimmte Reaktion hervorrufen (z.B. erstellen eines Teilresultats mit Fehlerinfo) dieselbe Exception zu werfen?
Wäre es nicht sinnvoll, wenn die Prozedur, die die Fehlerreaktion hervorrufen würde Teil der Exception wäre, bzw. die Exception das Interface implementieren würde?

 


Siehe auch: Exceptions versus Status Code propagation

 

Aufgaben eines guten Error-Handlings

Mitteilen:

  • Was ist passiert
    • Welche ursache hat welchen Impact –> Triage ermöglich. Wichtiges zuerst lösen.
    • Wie kann es gelöst werden.
  • Konstistenten Zustand im System zurück lassen. ROLLBACK.

Inhalt des Exception Objekt:

Typem von Exception Objekten:

  • Environmen Exception (Unterteilbar in Service Exception (unterteilbar in ServiceUnavailableEx und ServiceResponseException) und Platform Exception)
    Eine Platform Komponente oder ein Sevice war nicht verfügbar.
  • Data Validation Exception
    Ein Feld hat keinen/falschen Wert
    Felder:

    • Feld
      • Key
      • Value
    • Breached Constraint
    • Herkunft (wer hat das feld geliefert)
  • Allgemeine Exception Informationen: (Basisklasse. Data Validationn Exc und Environment Exc leiten davon ab)
    • Was ging schief (ist bei Environment Exceptions schon inherent klar)
    • Current Process (der nicht hat erfolgreich ausgeführt werden können)
  • Info- oder Addendum-Meldungen: Mit (teilweise) demselben Mechanismus wie exceptions werden of jegliche art von Processing-Messages verarbeitet. Das hat zu folge, dass auch Infos (z.B. „77 items verarbeitet“) als „Exception“ prozessiert werden.

List mit einem einzigen Element erstellen

    public static <T> List<T> singletonList(T o) {
        return new SingletonList<>(o);
    }

Hinzufuegen zu mapped Liste (:Map.computeIfAbsent)

Eine Liste innerhalb einer Map erweitern falls sie schon vorhanden ist oder sonst neu erstellen:

    private Map<Object, List<Object>> addToMappedList1(Map<Object, List<Object>> mapOfLists, Object key, Object newValue){

        if (mapOfLists.get(key) == null){
            mapOfLists.put(key, new ArrayList<>());
        }
        mapOfLists.get(key).add(newValue);
        return mapOfLists;
    }

Eleganter:

    private Map<Object, List<Object>> addToMappedList2(Map<Object, List<Object>> mapOfLists, Object key, Object newValue){

        mapOfLists.computeIfAbsent(key, k -> new ArrayList<>()).add(newValue);
        return mapOfLists;
    }

Kategorien – Mapping

  • Multi-Threading –> Concurrency –> Parrallel Processing
  • Stream –allenfalls–> Lambda