programing

Golang, mysql: 오류 1040:연결이 너무 많음

codeshow 2023. 10. 9. 23:42
반응형

Golang, mysql: 오류 1040:연결이 너무 많음

저는 github.com/go-sql-driver/mysql 드라이버를 사용하고 있습니다.

데이터베이스를 엽니다.

db, err := sql.Open("mysql", str)

그렇다면 나는 다음과 같은 mysql 코드로 각각 200번씩 호출되는 두 개의 함수를 가지고 있습니다.

rows, err := db.Query("select name from beehives")
if err != nil {
    panic(err)
}       
defer rows.Close()

두번째:

    err = db.QueryRow("select id, secret, shortname from beehives where shortname = ?", beehive).Scan(&id, &secre
    switch {
    case err == sql.ErrNoRows:
        err = errors.New("Beehive '"+beehive+"' not found.")
    case err != nil:
        panic("loginBeehive: "+ err.Error())
    default:
        // ... do the work

첫번째는 패닉입니다.

데이터베이스를 한 번만 열 때 두 개 이상의 연결이 있을 수 있으며 어떻게 닫습니까?

sql.Open은 실제로 데이터베이스에 대한 연결을 열지 않습니다.

sql.DB는 데이터베이스에 대한 연결 풀을 유지 관리합니다.데이터베이스를 쿼리할 때마다 프로그램은 이 풀에서 연결을 가져오거나 새 풀을 만듭니다.이 연결은 일단 닫으면 풀장에 다시 넣는 것 이상입니다.

이게 뭐예요.rows.Close()그래요. 당신의.db.QueryRow("...")당신이 전화할 때 내부적으로 같은 일을 합니다.Scan(...).

기본적인 문제는 각 쿼리마다 연결이 필요하지만 연결을 빨리 닫지 못하는 쿼리를 너무 많이 만들고 있다는 것입니다.이렇게 하면 프로그램에서 각 쿼리에 대한 새 연결을 만들어야 합니다.

sql에서 SetMaxOpenConns를 호출하여 프로그램이 사용하는 최대 연결 수를 제한할 수 있습니다.DB.

자세한 정보는 http://go-database-sql.org/surprises.html 을 참조하십시오.

*DB당신이 돌려받는 물건sql.Open단일 연결에 해당하지 않습니다.데이터베이스의 핸들로 생각하는 것이 좋습니다. 연결 풀을 관리하기 때문입니다.

'(*DB)로 열린 연결 수를 조절할 수 있습니다.유휴 연결을 위해 MaxOpenConns해당 쌍을 설정합니다.

그래서 기본적으로 여기서 일어나는 일은db.Query그리고.db.QueryRow자체적으로 연결을 획득하려고 하는데 DB 핸들은 동시 연결 수에 제한을 두지 않으므로 mysql이 처리할 수 있는 것보다 많이 열리면 코드가 패닉 상태가 됩니다.

준비된 진술을 하도록 노력합니다.db.Prepare(query string) (*Stmt, error)보다stmt.Query아니면stmt.Exec보다stmt.Close연결을 재사용할 수 있습니다.

안녕하세요. 사용후 가까운 연결을 시도해보시겠어요?

db, err := sql.Open("mysql", str)
defer db.Close() // close after end scope

내 프로그램은 항상 데이터베이스에 연결됩니다.(출석 얼굴 실시간 인식)

따라서 데이터베이스 연결을 열고 닫는 것은 가치가 없습니다.

따라서 프로그램을 초기화할 때만 데이터베이스 연결이 계속 열립니다.

func GetAllFaces() interface{} {
    OpenDatabaseConnection() ... 
}

하지만 나중에 데이터베이스에 접속해 접속 불가를 늘렸고 프로그램을 다운시켰습니다.하지만 문을 닫는 것은rows개체가 활성 연결을 최소한으로 유지했습니다.(나의 경우 1)

 func SaveAttendance(faceId int, date time.Time) error {
    sqlQuery := fmt.Sprintf("SELECT ... "))

    rows, err := DB.Query(sqlQuery) ...
    err = rows.Close()
    return err
}

언급URL : https://stackoverflow.com/questions/28135580/golang-mysql-error-1040-too-many-connections

반응형