去写unix /tmp/mysql.sock:发送大量请求时管道损坏

我有一个 Go API 端点,可以进行多个 MySQL 查询。当端点收到少量请求时,它工作得很好。但是,我现在正在使用具有 100 个请求的 apache bench 对其进行测试。前100个都通过了。但是,第 2 个 100 导致出现此错误


    2014/01/15 12:08:03 http: panic serving 127.0.0.1:58602: runtime error: invalid memory address or nil pointer dereference

goroutine 973 [running]:

net/http.func·009()

    /usr/local/Cellar/go/1.2/libexec/src/pkg/net/http/server.go:1093 +0xae

runtime.panic(0x402960, 0x9cf419)

    /usr/local/Cellar/go/1.2/libexec/src/pkg/runtime/panic.c:248 +0x106

database/sql.(*Rows).Close(0x0, 0xc2107af540, 0x69)

    /usr/local/Cellar/go/1.2/libexec/src/pkg/database/sql/sql.go:1576 +0x1e

store.findProductByQuery(0xc2107af540, 0x69, 0x0, 0xb88e80, 0xc21000ac70)

    /Users/dennis.suratna/workspace/session-go/src/store/product.go:83 +0xe3

store.FindProductByAppKey(0xc210337748, 0x7, 0x496960, 0x6, 0xc2105eb1b0)

    /Users/dennis.suratna/workspace/session-go/src/store/product.go:28 +0x11c

api.SessionHandler(0xb9eff8, 0xc2108ee200, 0xc2108f5750, 0xc2103285a0, 0x0, ...)

    /Users/dennis.suratna/workspace/session-go/src/api/session_handler.go:31 +0x2fb

api.func·001(0xb9eff8, 0xc2108ee200, 0xc2108f5750, 0xc2103285a0)

    /Users/dennis.suratna/workspace/session-go/src/api/api.go:81 +0x4f

reflect.Value.call(0x3ad9a0, 0xc2101ffdb0, 0x130, 0x48d520, 0x4, ...)

    /usr/local/Cellar/go/1.2/libexec/src/pkg/reflect/value.go:474 +0xe0b

reflect.Value.Call(0x3ad9a0, 0xc2101ffdb0, 0x130, 0xc2103c4a00, 0x3, ...)

    /usr/local/Cellar/go/1.2/libexec/src/pkg/reflect/value.go:345 +0x9d

github.com/codegangsta/inject.(*injector).Invoke(0xc2103379c0, 0x3ad9a0, 0xc2101ffdb0, 0x4311a0, 0x1db94e, ...)

看起来它不是由并发请求的数量引起的,而是由未正确关闭的东西引起的。我已经关闭了我在代码中创建的每个准备语句。我想知道是否有人以前见过这个。


编辑:这就是我初始化 MySQL 连接的方式:


func InitStore(environment string) error {

    db, err := sql.Open("mysql", connStr(environment))

    ....


    S = &Store{

        Mysql:       db,

        Environment: environment,

   }

}

在这种情况下,当我启动服务器时只发生一次。


至尊宝的传说
浏览 251回答 2
2回答

忽然笑

如果您使用 Go 1.2.x,您可以使用db.SetMaxOpenConns告诉 sql 包不要打开超过 X 个连接。在 X 连接已经打开(并且繁忙)之后需要数据库连接的查询将阻塞,直到有可用连接。话虽如此:“堆栈跟踪”的下一行是什么?http/server.go 中的 ~1093 行是服务功能失败时的恢复代码。看起来更像是您只是错误处理了一些数据,这导致它失败,或者您错过了错误检查,然后在您真正返回错误时尝试处理数据,等等。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go