为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
至尊宝的传说 2021-07-14 13:02:26
我有一个 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 dereferencegoroutine 973 [running]:net/http.func·009()    /usr/local/Cellar/go/1.2/libexec/src/pkg/net/http/server.go:1093 +0xaeruntime.panic(0x402960, 0x9cf419)    /usr/local/Cellar/go/1.2/libexec/src/pkg/runtime/panic.c:248 +0x106database/sql.(*Rows).Close(0x0, 0xc2107af540, 0x69)    /usr/local/Cellar/go/1.2/libexec/src/pkg/database/sql/sql.go:1576 +0x1estore.findProductByQuery(0xc2107af540, 0x69, 0x0, 0xb88e80, 0xc21000ac70)    /Users/dennis.suratna/workspace/session-go/src/store/product.go:83 +0xe3store.FindProductByAppKey(0xc210337748, 0x7, 0x496960, 0x6, 0xc2105eb1b0)    /Users/dennis.suratna/workspace/session-go/src/store/product.go:28 +0x11capi.SessionHandler(0xb9eff8, 0xc2108ee200, 0xc2108f5750, 0xc2103285a0, 0x0, ...)    /Users/dennis.suratna/workspace/session-go/src/api/session_handler.go:31 +0x2fbapi.func·001(0xb9eff8, 0xc2108ee200, 0xc2108f5750, 0xc2103285a0)    /Users/dennis.suratna/workspace/session-go/src/api/api.go:81 +0x4freflect.Value.call(0x3ad9a0, 0xc2101ffdb0, 0x130, 0x48d520, 0x4, ...)    /usr/local/Cellar/go/1.2/libexec/src/pkg/reflect/value.go:474 +0xe0breflect.Value.Call(0x3ad9a0, 0xc2101ffdb0, 0x130, 0xc2103c4a00, 0x3, ...)    /usr/local/Cellar/go/1.2/libexec/src/pkg/reflect/value.go:345 +0x9dgithub.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,   }}在这种情况下,当我启动服务器时只发生一次。
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

如果您使用 Go 1.2.x,您可以使用db.SetMaxOpenConns告诉 sql 包不要打开超过 X 个连接。在 X 连接已经打开(并且繁忙)之后需要数据库连接的查询将阻塞,直到有可用连接。

话虽如此:“堆栈跟踪”的下一行是什么?http/server.go 中的 ~1093 行是服务功能失败时的恢复代码。看起来更像是您只是错误处理了一些数据,这导致它失败,或者您错过了错误检查,然后在您真正返回错误时尝试处理数据,等等。


查看完整回答
反对 回复 2021-07-19
  • 2 回答
  • 0 关注
  • 248 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信