fix memory leaks in PrepareStatementDB

This commit is contained in:
Zehui Chen 2024-08-07 11:51:33 +08:00
parent 4a50b36f63
commit 408ec66048

View File

@ -18,7 +18,6 @@ type Stmt struct {
type PreparedStmtDB struct {
Stmts map[string]*Stmt
PreparedSQL []string
Mux *sync.RWMutex
ConnPool
}
@ -28,7 +27,6 @@ func NewPreparedStmtDB(connPool ConnPool) *PreparedStmtDB {
ConnPool: connPool,
Stmts: make(map[string]*Stmt),
Mux: &sync.RWMutex{},
PreparedSQL: make([]string, 0, 100),
}
}
@ -48,12 +46,18 @@ func (db *PreparedStmtDB) Close() {
db.Mux.Lock()
defer db.Mux.Unlock()
for _, query := range db.PreparedSQL {
if stmt, ok := db.Stmts[query]; ok {
delete(db.Stmts, query)
go stmt.Close()
for _, stmt := range db.Stmts {
go func(s *Stmt) {
// make sure the stmt must finish preparation first
<-s.prepared
if s.Stmt != nil {
_ = s.Close()
}
}(stmt)
}
// I think setting it to nil should be better, as there should be no one
// writing into it after calling Close, but leave it for compatibility and safety
db.Stmts = make(map[string]*Stmt)
}
func (sdb *PreparedStmtDB) Reset() {
@ -63,7 +67,6 @@ func (sdb *PreparedStmtDB) Reset() {
for _, stmt := range sdb.Stmts {
go stmt.Close()
}
sdb.PreparedSQL = make([]string, 0, 100)
sdb.Stmts = make(map[string]*Stmt)
}
@ -118,7 +121,6 @@ func (db *PreparedStmtDB) prepare(ctx context.Context, conn ConnPool, isTransact
db.Mux.Lock()
cacheStmt.Stmt = stmt
db.PreparedSQL = append(db.PreparedSQL, query)
db.Mux.Unlock()
return cacheStmt, nil