代码之家  ›  专栏  ›  技术社区  ›  WilliamKF

如果你去sql.DB数据库如果已关闭,是否关闭任何未关闭的准备查询?

  •  4
  • WilliamKF  · 技术社区  · 6 年前

    database/sql Close

    Prepare 但仍然显示了问题(我相信我可以将查询字符串传递给 QueryRow 得到一个隐含的 准备 ,但请在此明确说明,以便我可以提出我的问题):

    import (
        "database/sql"
    )
    
    // Store struct is the postgres
    type Store struct {
        pq *sql.DB
    }
    
    type Info struct {
        ID      string `json:"id"`
        Name    string `json:"name"`
    }
    
    func (s *Store) GetInfo(id string) Info {
        defer s.pq.Close()
        stmt, err := s.pq.Prepare(`
                SELECT id, name 
                FROM info 
                WHERE id = $1 LIMIT 1
                `)
        if err != nil {
            return Info{}
        }
        var res Info
        _ = stmt.QueryRow(id).Scan(&res.ID, &res.Name)
        return res
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Jonathan Hall    6 年前

    database/sql definitely expects you to close your own prepared statements 当DB或DC关闭时不会为您执行此操作。此外,我认为有可能服务器可能会清理后端内存时,你的程序退出,但PostgreSQL也不会清理它。。。

    https://github.com/lib/pq/issues/446

    数据库/sql 将为您处理清理,但如果您反复运行这些查询,则效率会降低,因此我强烈建议您使用以下方法进行清理:

    defer stmt.Close()