2017-12-30 21 views
-1

우리는 하루 동안의 코드에서 종종이 시나리오를 발견한다. db에 특정 레코드가 있는지 확인하고 싶으면 아무 일도하지 않지만 레코드가 누락 된 경우 작업을 수행 한 다음 레코드를 삽입하십시오.성능의 관점에서 duplicatekeyexception은 레코드가 먼저 존재하는지 확인하는 것보다 낫다.

푸시 알림을 보내는 동안 알림을 보내려는 경우에만 보내려합니다.

우리는 코드를 두 가지 방법으로

먼저 체크를 작성할 수있는 경우 notificationSent

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

우리는 예외 동안을 얻는 경우에 다른 방법은, 두 번째 경우에 시도 캐치

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

함께 할 것 실제 알림을 보내면 삽입물이 롤백됩니다. 따라서 첫 번째와 두 번째 접근법은 기능적으로 다르지 않습니다.

하지만 첫 번째 경우에는 db 호출을 두 번째 경우에 저장하는 동안 2 db 호출이 이루어집니다. 전반적으로 더 나은 접근 방식입니까?

답변

-2

두 번째 사례가 귀하의 사례에 더 좋다고 생각합니다.

0

성능면에서 중복 빈도가 높지 않은 한 두 번째 방법이 더 좋습니다. 예외는 값이 비싸지 만 데이터베이스로의 여행은 훨씬 더 많은 비용이 듭니다.

확인한 후에 다른 스레드 또는 프로세스가 알림을 삽입 할 수 있습니다. 그래서, 일반적으로, 당신은 두 가지 접근 방식을 결합 할 수 있습니다 :

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

어쨌든, 비 예외적 인 경우에 대한 예외를 점점 느낌이 좋지 않습니다. 나는 결합 된 접근 방법을 찾아 성능에 필요한 경우에만 최적화 할 것입니다. 예를 들어, 최근에 보낸 알림을 캐싱하면 대부분의 데이터베이스 읽기를 절약 할 수 있습니다.