LINUX.ORG.RU

Таймаут в контексте не срабатывает

 , , ,


0

2
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout)*time.Second)
defer cancel()
connect, err := mssql.NewConnector(connStr)
if err != nil {
	return err
}
db := sql.OpenDB(connect)
defer db.Close()
_, err = db.ExecContext(ctx, "WAITFOR DELAY '00:00:01';")
return err

И вижу зависшее соединение TCP lolcathost:37132->sql2k801.discountasp.net:ms-sql-s (ESTABLISHED). Есть такой же тикет https://github.com/denisenkom/go-mssqldb/issues/604 и, похоже, всем на*рать на него. Вопрос к опытным гоферам, как принудительно закрыть коннект и вернуть err средствами самого Go?

★★★

Даже такая конструкция не срабатывает.

	connect, err := mssql.NewConnector(connStr)
	if err != nil {
		return err
	}
	db := sql.OpenDB(connect)
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout)*time.Second)
	go func() {
		time.Sleep(time.Duration(timeout) * time.Second)
		db.Close()
		cancel()
	}()

А М$ это советует в продакт https://github.com/microsoft/sql-server-samples/tree/master/samples/tutorials/go

dnb ★★★ ()

как принудительно закрыть коннект и вернуть err средствами самого Go?

DB.Conn возвращает объект sql.Conn. Попробуй заюзать его. Если не сработает попробуй закрыть (conn.Close()).

DukeNukem ()

ты знал на что шел выбирая язык для петухов на самокатах, у тебя появился неплохой шанс не отходя от работы поучаствовать в опенсорсе, удачи братишка.

anonymous ()