连接mysql有内存泄漏?

229469922 · 2014-11-14 12:00:43 · 3690 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2014-11-14 12:00:43 的主题,其中的信息可能已经有所发展或是发生改变。

各位大牛,求帮忙!

问题描述:

1,并发10条请求,database/sql 连接池打开10个mysql连接,执行结束后,连接关闭,但内存不回收。
2,如果继续第1步,内存不会上升。
3,继续并发20条请求,则内存会再上升。
4,继续并发请求,如果并发数大于20,则内存上升,如果并发数小于20,则内存不会上升。
5,内存上升后,不会下降。

代码:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "io"
    "log"
    "net/http"
)

var db *sql.DB

func main() {

    var err error
    db, err = sql.Open("mysql", "root:123456@/test")
    if err != nil {
        fmt.Println(err)
    }
    defer db.Close()

    http.HandleFunc("/hello", Hello)
    err = http.ListenAndServe(":12345", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }

}

func Hello(w http.ResponseWriter, req *http.Request) {
    rows, err := db.Query("SELECT content FROM news WHERE id > 0 and id <= 10000")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    for rows.Next() {
        var content string
        if err := rows.Scan(&content); err != nil {
            log.Fatal(err)
        }
    }
    if err := rows.Err(); err != nil {
        log.Fatal(err)
    }
    io.WriteString(w, "done")
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3690 次点击  
加入收藏 微博
1 回复  |  直到 2014-11-14 15:12:21
zhaohui_kevin
zhaohui_kevin · #1 · 10年之前

这个还真没做过实验,按理defer close以后应该会释放资源才对,要不发个邮件给驱动作者讨论下?

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传