go-oci8: Why I can not close database connection?

`package main

import ( “context” “database/sql” “fmt” “log” “net/http” “os” “os/signal” “syscall” “time”

_ "github.com/mattn/go-oci8"

)

func main() {

db, err := sql.Open("oci8", fmt.Sprintf(
	"%v/%v@%v:%v/%v",
	"user",
	"pass",
	"0.0.0.0",
	"000",
	"serve-id"))
if err != nil {
	log.Fatal(err)
}

router := http.NewServeMux()

router.HandleFunc("/poc-close-connect-db", func(res http.ResponseWriter, req *http.Request) {
	if err := db.PingContext(req.Context()); err != nil {
		res.WriteHeader(503)
	}

	rows, err := db.Query("select sysdate from dual")
	if err != nil {
		fmt.Println("Error running query")
		fmt.Println(err)
		return
	}
	defer rows.Close()

	var thedate string
	for rows.Next() {

		rows.Scan(&thedate)
	}
	fmt.Printf("The date is: %s\n", thedate)
})

srv := &http.Server{
	Handler: router,
	Addr:    fmt.Sprintf(":%s", "8080"),
}

go func() {
	log.Fatal(srv.ListenAndServe())
}()

stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt)
signal.Notify(stop, syscall.SIGTERM)

<-stop
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

if err := srv.Shutdown(ctx); err != nil {
	log.Printf("error shutting down server %s", err)
} else {
	log.Println("Server gracefully stopped")
}

stats := db.Stats()
log.Printf("error closing db connection %s", stats)

if err := db.Close(); err != nil {
	log.Printf("error closing db connection %s", err)
} else {
	log.Println("Db connection gracefully closed")
}

}`

I tried close database but I can not close database connection. Why I can not gracefully close database connection?

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Comments: 29 (16 by maintainers)

Most upvoted comments

Have you got some firewall filtering out-of-band breaks? Try creating a sqlnet.ora file with DISABLE_OOB=ON in it. See https://github.com/oracle/node-oracledb/issues/688#issuecomment-497345542 for one example where this helped.

I created sqlnet.ora file with DISABLE_OOB=ON at /instantclient_18_1/network/admin/sqlnet.ora

It’s works fine.

@cjbj thank you so much.

One of possibilities is that Oracle runtime handles signal it-self with C runtime.