2017-12-30 5 views
-1

Wir finden dieses Szenario oft in unseren täglichen Codes. Wir wollen prüfen, ob ein bestimmter Datensatz in db existiert, wenn dies der Fall ist, nichts tun, aber wenn der Datensatz fehlt, Maßnahmen ergreifen und dann den Datensatz einfügen.Von der Perspektive der Leistung abfangen duplicatekeyException besser als zu prüfen, ob Datensatz zuerst

z.B. Beim Senden einer Push-Benachrichtigung möchten wir nur eine Benachrichtigung senden, wenn sie noch nicht gesendet wurde.

Wir könnten den Code zwei Möglichkeiten

Prüfen Sie zuerst, ob notificationSent schreiben

boolean notificationSent = notificationDao.checkNotificationId(notificationId); 
if(notificationSent){ 
    return; 
} 
else{ 
    //send notification 
    notificationDao.insertNotification(notificationModel); 
} 

Der andere Weg mit Try-Catch

try{ 
    notificationDao.insertNotification(notificationModel); 
    //send notification 
} 
catch(DuplicateKeyException e){ 
    // log and do nothing 
} 

Im zweiten Fall wäre, wenn wir Ausnahme erhalten, während Wenn wir die aktuelle Benachrichtigung senden, rollen wir einfach die Einfügung zurück. und so sind der erste und der zweite Ansatz nicht funktional verschieden.

Aber im ersten Fall werden 2 db-Aufrufe gemacht, während wir im zweiten Fall einen db-Aufruf speichern. Ist es insgesamt ein besserer Ansatz?

Antwort

-2

Ich denke auch, dass der zweite Fall besser für Ihr Beispiel ist.

0

In Bezug auf die Leistung ist der zweite Ansatz besser, es sei denn, die Häufigkeit von Duplikaten ist hoch. Während Ausnahmen kostspielig sind, ist eine Reise in die Datenbank sogar viel kostspieliger.

Beachten Sie, dass nach Ihrer Überprüfung möglicherweise ein anderer Thread oder Prozess die Benachrichtigung vor Ihnen eingefügt hat. So im Allgemeinen, können Sie beide Ansätze kombinieren möchten:

boolean notificationSent = notificationDao.checkNotificationId(notificationId); 
if (notificationSent) { 
    return; 
} 
try { 
    notificationDao.insertNotification(notificationModel); 
} catch (DuplicateKeyException e){ 
    // log and do nothing 
} 

Wie auch immer, Ausnahmen immer für Nicht-Ausnahmefällen fühlt sich nicht richtig. Ich würde mich für den kombinierten Ansatz entscheiden und nur dann optimieren, wenn es für die Leistung erforderlich ist. Zum Beispiel kann das Zwischenspeichern der kürzlich gesendeten Benachrichtigungen die meisten Datenbanklesevorgänge speichern.

Verwandte Themen