egreb.net

Cancel database query with context

Cancel database query with context

published 27 Dec 2017

An short example of how we can use the context package to cancel an query request. We are gonna use the WithTimeout function to do this.

First a simple webserver:

func main() {
	port := ":8000"

	// query route
	http.HandleFunc("/query", query)

	log.Println("Listening on " + port)
	log.Fatal(http.ListenAndServe(port, nil))
}

The database handler:

func query(w http.ResponseWriter, r *http.Request) {
	// We create a new context with an given timeout at 1 second
	ctx, cancel := context.WithTimeout(r.Context(), time.Second*1)

	defer cancel()

	// simulating an database query
	time.Sleep(time.Second * 2)

	// If the timeout is exceeded ctx.Done() will be triggered
	select {
	case <-ctx.Done():
		w.Write([]byte(ctx.Err()))
	default:
		w.Write([]byte(`timeout not exceeded`))
	}
}

Thanks for reading