当我并行运行使用mysql驱动程序(Gorm)的函数时,我发现当我设置以下内容时: db.DB()。SetMaxOpenConns(30) db.DB()。SetMaxIdleConns(10)
我得到一个干净的输出,没有任何恐慌/错误消息。
我的max_connection的数据库服务器变量设置为100.我发现如果我将SetMaxOpenConns设置为50或更高,我就会开始接收
[mysql] 2017/01/25 14:26:09 packets.go:33: read tcp 127.0.0.1:60614->127.0.0.1:3306: read: connection reset by peer
[mysql] 2017/01/25 14:26:09 packets.go:130: write tcp 127.0.0.1:60614->127.0.0.1:3306: write: broken pipe
如果我只是打印错误而不是恐慌,那么错误最终会消失并且脚本完成处理。
我很难理解如何操纵这些价值观。 Max Open conn为什么当开放连接速率较低时,脚本似乎没有问题连接/读取但是高于服务器限制的最高值是有问题的。
MariaDB版本:10.1.21 转版:1.7.4 我正在解析的csv文件中有210万条记录。 我正在将2000条记录分配到每个插入字符串
中以下是主要代码的一部分
func main(){
//Setup and Connect to database
//Set variables
//Read CSV File
dbConnect()
defer db.Close()
db.DB().SetMaxOpenConns(30)
db.DB().SetMaxIdleConns(10)
db.DB().SetConnMaxLifetime(time.Second * 14400)
filehandle, err := os.Open(physicianCSV)
checkErr(err)
defer filehandle.Close()
reader := csv.NewReader(filehandle)
_, err = reader.Read()
checkErr(err)
for i := 0; i <= readLimit; i++ {
record, err := reader.Read()
if err != nil {
if err == io.EOF {
break
}
panic(err)
}
physician = convertCSVRecordToPhysician(record)
//..Do stuff with physician, edit struct properties
physicians = append(physicians, physician)
if math.Mod(float64(i), float64(bulkAmount)) == 0 && i != 0 {
fmt.Println(i, "Records: From ", i-bulkAmount, "to", i)
wg.Add(1)
sliceOfPhys := make([]Physician, bulkAmount)
copy(sliceOfPhys, physicians)
go bulkSavePhysicians(sliceOfPhys)
physicians = physicians[:0]
}
}
fmt.Println(readLimit, "records inserted")
wg.Wait()
}
func bulkSavePhysicians(_physicians []Physician) {
defer func() {
if x := recover(); x != nil {
fmt.Println(x)
}
}()
defer wg.Done()
sqlStringArray := buildSQLStatements(_physicians)
batchSQL := fmt.Sprintf("insert into physicians values %s ;", strings.Join(sqlStringArray, ","))
tx := db.Begin()
errors := tx.Exec(batchSQL).GetErrors()
if len(errors) > 0 {
panic(errors)
}
tx.Commit()
}
func buildSQLStatements(_physicians []Physician) []string {
var valueStr string
var valueArr []string
for _, phys := range _physicians {
valueStr = fmt.Sprintf(`( "%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s" )`, phys.NPI,
phys.PACID,
phys.ProfessionalEnrollmentID,
strings.Replace(phys.LastName, "'", "\\'", -1),
phys.FirstName,
phys.MiddleName,
phys.Suffix,
phys.Gender,
phys.Credential,
strings.Replace(phys.MedicalSchoolName, "'", "\\'", -1),
phys.GraduationYear,
phys.PrimarySpecialty,
phys.SecondarySpecialty1,
phys.SecondarySpecialty2,
phys.SecondarySpecialty3,
phys.SecondarySpecialty4,
phys.AllSecondarySpecialties,
strings.Replace(phys.OrganizationLegalName, "'", "\\'", -1),
phys.GroupPracticePACID,
phys.NumberOfGroupPracticeMembers,
strings.Replace(phys.Line1StreetAddress, "'", "\\'", -1),
phys.Line2StreetAddress,
phys.MarkerOfAddressLine2Suppression,
phys.City,
phys.State,
phys.ZipCode,
phys.PhoneNumber,
phys.HospitalAffiliationCCN1,
phys.HospitalAffiliationLBN1,
phys.HospitalAffiliationCCN2,
phys.HospitalAffiliationLBN2,
phys.HospitalAffiliationCCN3,
phys.HospitalAffiliationLBN3,
phys.HospitalAffiliationCCN4,
phys.HospitalAffiliationLBN4,
phys.HospitalAffiliationCCN5,
phys.HospitalAffiliationLBN5,
phys.ProfessionalAcceptsMedicareAssignment,
phys.ReportedQualityMeasures,
phys.UsedElectronicHealthRecords,
phys.ParticipatedInTheMedicareMaintenance,
phys.CommittedToHeartHealth,
phys.SpecialtyID)
valueArr = append(valueArr, valueStr)
}
return valueArr
}