Ответ
Используйте контекст (context.Context) для установки таймаутов и отмены долгих запросов. Пример:
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
row := db.QueryRowContext(ctx, "SELECT * FROM users WHERE id = ?", userID)
if err := row.Scan(&user); err != nil {
if errors.Is(err, context.DeadlineExceeded) {
log.Println("Query timeout exceeded")
}
return err
}
Дополнительные меры:
- Настройте connection pool с разумными лимитами
- Добавьте индексы для медленных запросов
- Разделяйте запросы на чанки при больших данных
- Мониторьте и логируйте медленные запросы