Ответ
Используйте контексты для управления таймаутами запросов к БД. Устанавливайте разумные дедлайны и обрабатывайте ошибки контекста. Пример:
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
row := db.QueryRowContext(ctx, "SELECT * FROM users WHERE id = $1", userID)
if err := row.Scan(&user); err != nil {
if errors.Is(err, context.DeadlineExceeded) {
// Обработка таймаута
return fmt.Errorf("database timeout")
}
// Другие ошибки
return err
}
Дополнительные меры:
- Настройте пул соединений (SetMaxOpenConns, SetConnMaxLifetime)
- Реализуйте retry-логику для временных ошибок
- Добавьте circuit breakers
- Мониторьте длительные запросы