golang连接mysql并发出现bad connection

昨天发现的,golang连接mysql并发出现bad connection,我只是升级到go1.1而已,mysql的最大连接我已经调节到5000了,但从phpmyadmin界面上看见连接不断增大到phpmyadmin出现连接错误,夸张。

我的代码大概就是一个

db, e := sql.Open("mymysql", "tcp:127.0.0.1:3306*xxxdb/root/123456789")

for rows.Next(){ 
....
....
//checkcount,检查数据是否存在
checkcount(db,xxx)
....
insertdata(db,yyyyy)

}

为什么连接会上千的,怪啊,最后参考网上的代码,改了个连接池出来

var MAX_POOL_SIZE=200
var MySQLPool chan *sql.DB
func getMySQL() *sql.DB {  
    
    if MySQLPool == nil {  
        MySQLPool = make(chan *sql.DB, MAX_POOL_SIZE)  
    }  
    if len(MySQLPool) == 0 {  
        go func() {  
            for i := 0; i < MAX_POOL_SIZE/2; i++ {  
		mysqlc, err := sql.Open("mymysql", "tcp:127.0.0.1:3306*xxxdb/root/123456789")
                if err != nil {  
                    panic(err)  
                }     
                putMySQL(mysqlc)  
            }     
        }()   
    }     
    return <-MySQLPool  
}  

func putMySQL(conn *sql.DB) {  
    if MySQLPool == nil {  
        MySQLPool = make(chan *sql.DB, MAX_POOL_SIZE)  
    } 
    
    if len(MySQLPool) == MAX_POOL_SIZE {  
        conn.Close()  
        return  
    }  
    MySQLPool <- conn  
}

然后代码里引用是:

dbx:=getMySQL()
rows, err := dbx.Query(“select count(*)as tcount from xxx”)
defer dbx.Close()

这样之后,并发连接才维持在200左近, go语言就是怪啊,对于我这半路出家学编程的,十分辛苦呢,好在还有goole大人.

还有想说,java同样的代码连接没增大,程序功能一样,更加快呢,不过就是写得别扭一点, python同样的功能代码,用了连接池,维持连接在20左近,实在差太远了,

突然觉得go语言是非主流呢.!

关于无聊人

一个无聊人而已
此条目发表在技术生活分类目录。将固定链接加入收藏夹。

4 Responses to golang连接mysql并发出现bad connection

  1. zhousb说:

    哥们,你用错了

    dbx:=getMySQL()
    rows, err := dbx.Query(“select count(*)as tcount from xxx”)
    defer putMySQL(dbx)

    要这么用。。。

  2. 无聊人说:

    这样用结果也是一样的,一样会爆连接的.

  3. xxxx说:

    The returned DB is safe for concurrent use by multiple goroutines and maintains its own pool of idle connections. Thus, the Open function should be called just once. It is rarely necessary to close a DB.

    open本身返回就是连接池,你还弄了个连接池。。。

  4. LeO说:

    试着别每次都 open, close应该是 rows.Close();你会有惊喜的

发表评论

电子邮件地址不会被公开。 必填项已用*标注