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)
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.