Skip to content

使用 golang 连接 kingshard,事务提交后 kingshard 不会释放连接 #352

@fireball2018

Description

@fireball2018

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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions