-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Closed
Description
golang 连接 kingshard,事务提交后 kingshard 不会释放连接。
kingshard 设置 max_conns_limit=10
,执行以下代码,只能执行前10次
test 1:
package main
import (
"fmt"
"os"
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/satori/go.uuid"
)
var (
userDatabase = "kingshard:kingshard@(127.0.0.1:9696)/user_dev?charset=utf8&parseTime=True&loc=Local&strict=true"
)
func main() {
for i := 0; i < 20; i++ {
userDb, err := sql.Open("mysql", userDatabase)
if err != nil {
fmt.Printf("can not connect db: %s", err.Error())
os.Exit(1)
}
db, err2 := userDb.Begin()
if err2 != nil {
fmt.Printf("err: %s", err2.Error())
}
db.Exec("INSERT INTO `user` (`id`, `name`) VALUES (?, ?)", uuid.NewV4().String(), uuid.NewV4().String())
err1 := db.Commit()
if err1 != nil {
fmt.Printf("err: %s", err1.Error())
}
fmt.Printf("%d done\n", i)
userDb.Close()
}
}
test 2:
package main
import (
"fmt"
"os"
"database/sql"
_ "github.com/go-sql-driver/mysql"
// "github.com/jinzhu/gorm"
"github.com/satori/go.uuid"
)
var (
userDatabase = "kingshard:kingshard@(127.0.0.1:9696)/user_dev?charset=utf8&parseTime=True&loc=Local&strict=true"
)
func main() {
userDb, err := sql.Open("mysql", userDatabase)
if err != nil {
fmt.Printf("can not connect db: %s", err.Error())
os.Exit(1)
}
for i := 0; i < 20; i++ {
db, err2 := userDb.Begin()
if err2 != nil {
fmt.Printf("err: %s", err2.Error())
}
db.Exec("INSERT INTO `user` (`id`, `name`) VALUES (?, ?)", uuid.NewV4().String(), uuid.NewV4().String())
err1 := db.Commit()
if err1 != nil {
fmt.Printf("err: %s", err1.Error())
}
fmt.Printf("%d done\n", i)
}
userDb.Close()
}
此时 kingshard 状态 idle_conn=0
, 在我关闭执行进程后仍然不会释放连接数。
使用 python 执行事务不会出现此情况
mysql: 5.6.21
golang: 1.8.3
github.com/go-sql-driver/mysql: v1.3
kingshard: 1.5
user.sql:
CREATE TABLE `user` (
`id` varchar(36) NOT NULL DEFAULT '',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
更新一:
不使预处理则可以释放连接,做如下修改可以正常执行:
db.Exec("INSERT INTO `user` (`id`, `name`) VALUES (?, ?)", uuid.NewV4().String(), uuid.NewV4().String())
修改为:
db.Exec(fmt.Sprintf("INSERT INTO `user` (`id`, `name`) VALUES ('%s', '%s')", uuid.NewV4().String(), uuid.NewV4().String()))
Metadata
Metadata
Assignees
Labels
No labels