免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6270 | 回复: 12
打印 上一主题 下一主题

[其他] golang 如何连 mysql 不要每次建立一个连接 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-06-07 17:46 |只看该作者 |倒序浏览
本帖最后由 zylthinking 于 2017-06-07 17:48 编辑

@cokeboL, 有没有趟过这个坑?
mysql 自己认最大链接 150,
现在是设置了
       db.SetMaxOpenConns(10);
        db.SetMaxIdleConns(10);


不起作用;
stmt.Close() 也调用了
row.Close() 也调用了

就是不起作用;
一次调用创建一个新连接, 150次准挂

我就不明白了, 这还有救吗



func db_get() (*sql.DB, error) {
    if (db != nil) {
        return db, nil;
    }

    mux.Lock();
    if (db != nil) {
        mux.Unlock();
        return db, nil;
    }

    conf := setting.Conf;
    if (conf == nil) {
        mux.Unlock();
        return nil, errors.New("can't get mysql configuration");
    }

    var buf bytes.Buffer;
    buf.WriteString(conf.Mysql.User);
    buf.WriteByte(':');
    buf.WriteString(conf.Mysql.Passwd);
    buf.WriteString("@tcp(");
    buf.WriteString(conf.Mysql.Addr);
    buf.WriteString(")/db?charset=utf8");
    db, err := sql.Open("mysql", buf.String());
    if (err == nil) {
       db.SetMaxOpenConns(10);
        db.SetMaxIdleConns(10);

    }
    mux.
Unlock();
    return db, err;
}

func UserGet(email string) (*Account, error) {
    db
, err := db_get();
    if (err != nil) {
        
return nil, err;
    }

    stmt
, err := db.Prepare("select * from account where email = ?");
    if (err != nil) {
        
return nil, err;
    }
    defer stmt.Close();

    row, err:= stmt.Query(email);
    if (err != nil) {
        
return nil, err;
    }
    defer row.Close();

    obj, err := fill_row(row, &Account{});
    if (err != nil) {
        
return nil, err;
    } else if (obj == nil) {
        
return nil, nil;
    }
   
return obj.(*Account), nil;
}


论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
2 [报告]
发表于 2017-06-07 18:44 |只看该作者
靠, 我知道怎么会是了

db, err := sql.Open("mysql", buf.String());
这个声明了一个新的本地变量 db, 而不是全局 db 变量;导致全局 db 永远是 nil, 从而不断创建 db 对象导致的, 坑的你没话说

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
3 [报告]
发表于 2017-06-07 22:21 |只看该作者
解决了就好,但是为啥每次一个新连接?弄个连接池哇

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
4 [报告]
发表于 2017-06-07 22:23 |只看该作者
额,没看一楼代码,刚细看到二楼解释

我用的 mymysql,这个据说比官方的要好点

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
5 [报告]
发表于 2017-06-12 12:12 |只看该作者
本帖最后由 yulihua49 于 2017-06-12 12:20 编辑
zylthinking 发表于 2017-06-07 17:46
@cokeboL, 有没有趟过这个坑?
mysql 自己认最大链接 150,
现在是设置了

不管哪种语言,不管哪种数据库,每次一个连接都不是好办法。
应该有一个中间件,负责管理有限的数据库连接。成千上万的客户端通过中间件来使用数据库。
这个中间件的服务器,管理着N个数据库连接池,每个池有M个连接。每个客户端可以选择请求某个池。每个池都有一个队列。配置适当参数可以使数据库在最大负载能力下工作。客户端排队能够保证总体的最低平均响应时间。

150个连接,一般可供应上万客户端的使用。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
6 [报告]
发表于 2017-06-12 18:30 |只看该作者
回复 5# yulihua49

你都没搞清楚是怎么回事, 就开始飙常识................

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
7 [报告]
发表于 2017-06-13 15:48 |只看该作者
本帖最后由 yulihua49 于 2017-06-13 15:57 编辑
zylthinking 发表于 2017-06-12 18:30
回复 5# yulihua49

你都没搞清楚是怎么回事, 就开始飙常识................

我回帖时你的问题已经解决。就对每次一个连接提议。而且,你看看你的题目,我的回答不扣题吗?你居然。。。。。。。不说了。
一哥们,做erlang接口,用C访问数据库,每次请求插入一个记录,居然:打开-插入-commit-关闭。每条记录干这么一圈。我也是这么建议的。

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
8 [报告]
发表于 2017-06-20 15:20 |只看该作者
以前游戏公司,代码很淳朴,c/cpp的,一个服务器就一个连接,


golang不熟,没玩过

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
9 [报告]
发表于 2017-06-26 14:23 |只看该作者
你开几个goroutine专门处理MySQL,有数据库请求通过channel发过来给这几个goroutine处理,这样就不会爆了。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
10 [报告]
发表于 2017-06-26 16:38 |只看该作者
回复 9# windoze

如果数据库操作之后还有代码,用channel 就要回调了,不好
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP