source

GORM 시간 초과 시 MariaDB 세션을 제대로 종료할 수 없음

lovecheck 2023. 8. 15. 11:13
반응형

GORM 시간 초과 시 MariaDB 세션을 제대로 종료할 수 없음

저는 GORM을 사용하여 MariaDB에 10초의 시간 제한을 두고 모델을 일괄 삽입하는 서비스를 가지고 있습니다.

timeoutCtx, cancel := context.WithTimeout(ctx, 10*time.Second)
defer cancel()

var gorm *gorm.DB

tx := gorm.
    Session(&gorm.Session{SkipDefaultTransaction: true, Context: timeoutCtx}).
    Table(TableName("tableName")).
    Clauses(clause.OnConflict{DoNothing: true}). 
    Create(models)
if tx.Error != nil {
    return tx.Error
}
return nil

때때로 배치 삽입으로 인해 시간 초과 컨텍스트가 발생하고 응용 프로그램 연결이 DB에 다른 배치 삽입에 재사용됩니다.그러나 DB 측에서는 실제 삽입이 얼마나 걸리든 세션/연결이 열린 상태로 유지됩니다.각 연결 슬롯은 연결 슬롯을 차지하지만 최악의 경우 GORM은 DB에 대한 새 연결을 생성하고 시간 초과도 발생하며 결국 모든 슬롯이 사용되어 데이터베이스가 잠깁니다.

(와 함께)MaxIdleConns+MaxOpenConns) * num_max < db_max_connections, 이렇게 됩니다.

저는 이것을 현지에서 재현할 수 없지만, 우리의 생산 데이터베이스에서 여러 번 발생했습니다.세션 제한 시간 동안 GORM이 세션/연결을 제대로 종료하지 않는 것 같습니다.DB 측에서 연결을 명시적으로 종료하고 컨텍스트 시간 초과 시 풀로 되돌릴 수 있는 방법이 있습니까?

언급URL : https://stackoverflow.com/questions/76059564/cannot-properly-terminate-a-mariadb-session-on-gorm-timeout

반응형