Golang中继承sql.st后st.Close()失效问题

Golang中继承sql.st后st.Close()失效问题 我继承了sql.st,然后尝试运行st.close,但它产生了goroutine错误。我没有重写close函数,也没有做任何修改,为什么会产生这个错误呢?

代码:

package main

import (
    _"database/sql"
    "fmt"
    a "Vnext/go_ibm_db"
)

func main() {
    con := "HOSTNAME=localhost;PORT=50000;DATABASE=go;UID=uname;PWD=pass"
    mydb, err := a.Open("go_ibm_db", con)
    if err != nil {
        fmt.Println(err)
    }
	defer mydb.Close()
    myst,err:=mydb.Prepare("Insert into putdata(a,b) values(?,?)")
	if err != nil{
	fmt.Println(err)
	}
	myst.Query("akhil","ravuri")
	myst.Close()
}

包代码:

type DBd struct {
	sql.DB
}

func Open(driver string, ConStr string) (*DBd, error) {
	db, err := sql.Open(driver, ConStr)
	if err != nil {
		return nil, err
	}
	dbd := &DBd{
		DB: *db,
	}
	return dbd, nil
}

type Stmtd struct {
	sql.Stmt
	Hand api.SQLHSTMT
}

func (db *DBd) Prepare(query string) (*Stmtd, error) {
	st, err := db.DB.Prepare(query)
	if err != nil {
		return nil, err
	}
	std := &Stmtd{
		Stmt: *st,
		Hand: Handle,
	}
	return std, nil
}

错误:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [semacquire]:
sync.runtime_SemacquireMutex(0xc0000881a4, 0x0)
        C:/Go/src/runtime/sema.go:71 +0x44
sync.(*Mutex).Lock(0xc0000881a0)
        C:/Go/src/sync/mutex.go:134 +0x106
database/sql.(*DB).Close(0xc000088180, 0x44, 0xc000088180)
        C:/Go/src/database/sql/sql.go:791 +0xa4
panic(0x4c95c0, 0xc000030060)
        C:/Go/src/runtime/panic.go:513 +0x1c7
database/sql.(*DB).removeDepLocked(0xc000088180, 0x50b6a0, 0xc0000b4140, 0x4e4760, 0xc0000b4140, 0x0)
        C:/Go/src/database/sql/sql.go:629 +0x3e3
database/sql.(*DB).removeDep(0xc000088180, 0x50b6a0, 0xc0000b4140, 0x4e4760, 0xc0000b4140, 0x0, 0x2)
        C:/Go/src/database/sql/sql.go:619 +0xba
database/sql.(*Stmt).Close(0xc0000b4140, 0x0, 0x0)
        C:/Go/src/database/sql/sql.go:2674 +0x1eb
main.main()
        C:/Users/rakhil/Desktop/st_close.go:21 +0x1c8

goroutine 19 [select]:
database/sql.(*DB).connectionOpener(0xc0000880c0, 0x50bac0, 0xc000046100)
        C:/Go/src/database/sql/sql.go:1042 +0x132
created by database/sql.OpenDB
        C:/Go/src/database/sql/sql.go:698 +0x1b5

goroutine 20 [select]:
database/sql.(*DB).connectionResetter(0xc0000880c0, 0x50bac0, 0xc000046100)
        C:/Go/src/database/sql/sql.go:1056 +0x148
created by database/sql.OpenDB
        C:/Go/src/database/sql/sql.go:699 +0x1eb
exit status 2

有人能帮我解决这个问题吗? 谢谢。


更多关于Golang中继承sql.st后st.Close()失效问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

感谢@johandalabacka的反馈。

我已经找到解决方法了。只需将Stmtd结构体声明中的sql.Stmt改为*sql.Stmt就可以了。

谢谢。

更多关于Golang中继承sql.st后st.Close()失效问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


当我移除 defer mydb.Close 并将 mydb.Close() 放在 myst.Close() 之后时,出现以下错误:

panic: unpaired removeDep: no deps for *sql.Stmt

goroutine 1 [running]:
database/sql.(*DB).removeDepLocked(0xc000088180, 0x50c740, 0xc0000421e0, 0x4e5760, 0xc0000421e0, 0x0)
        C:/Go/src/database/sql/sql.go:629 +0x3e3
database/sql.(*DB).removeDep(0xc000088180, 0x50c740, 0xc0000421e0, 0x4e5760, 0xc0000421e0, 0x0, 0xc00006fee8)
        C:/Go/src/database/sql/sql.go:619 +0xba
database/sql.(*Stmt).Close(0xc0000421e0, 0x0, 0x0)
        C:/Go/src/database/sql/sql.go:2674 +0x1eb
main.main()
        C:/Users/rakhil/Desktop/SQLPutData.go:40 +0x25e
exit status 2
回到顶部