728x90
반응형

서버 장애가 나서 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()
...

 

참고 문헌

  1. https://golang.org/pkg/database/sql/#DB.ExecContext

  2. https://golang.org/pkg/database/sql/#Conn.QueryContext

  3. https://golang.org/pkg/database/sql/#DB.PingContext

반응형

+ Recent posts