서버 장애가 나서 panic이 발생했다는 알람이 많이 왔었다.
원인은 데이터베이스가 다운돼 쿼리를 실행할 수 없어 발생한 장애였다.
코드를 확인해보니 에러를 확인하고 에러가 없는 경우에 Close 함수를 실행해야 했는데
항상 Close 함수를 실행을 하여 rows가 nil 값인데도 참조하여 발생한 문제였다.
rows, err := db.Query(query, args)
if err != nil {
return
}
defer rows.Close()
...
그래서 에러를 확인하고 Close 함수를 실행하도록 코드를 수정했다.
혹시 몰라 일정 시간 이상 응답이 없으면 에러가 발생하도록 하는 코드도 추가했다.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
rows, err := db.QueryContext(ctx, query, args)
if err != nil {
return
}
defer rows.Close()
...
참고 문헌
'Golang' 카테고리의 다른 글
[Go] 정규식 파싱 문제 (0) | 2020.11.05 |
---|---|
[Go] 데이터베이스 조회가 오래 걸리는 문제 (0) | 2020.10.08 |
[Golang] too many open files 에러 해결 (0) | 2020.08.06 |
[Golang] Echo 파일 업로더 서버 구축 (0) | 2020.07.30 |
[Golang] 커맨드 명령 동시 실행 및 디렉토리 제거 (0) | 2020.07.02 |