2016-11-10 13 views
0

나는 Golang/Postgres를 처음 사용하며 시험을 수행하고 pq : 죄송합니다. 이미 많은 고객이 있습니다. 오류가 발생했습니다. 나는 그 오류 내 포스트 그레스 인스턴스는 100 개 연결의 최대로 설정하고 난 보통 60 ~ 70 삽입에서 얻을 수있는이 코드golang postgres 너무 많은 연결 오류

for i := 0; i < 10000; i++ { 
    profile_id = profile_id+1 
    on, err := db.Query("insert into streams (post,profile_id,created_on) values ($1,$2,$3)", post, profile_id, created_on) 
    defer on.Close() 

    if err != nil { 
     fmt.Fprintln(w, "-1") 
     log.Fatal(err) 
    } 
} 

에 해당 오류를 얻고있다. 모든 연결은 For 루프에 대한 하나의 샘플에서옵니다. 내가 뭘 잘못하고 있니, 여기 내 코드가있다. 내가 아는 한 1 개의 연결은 많은 다른 쿼리를 저장할 수 있으므로 왜 나는 단지 60 ~ 70 개의 인서트 만 제공하는지 알 수 없다.

func Insert_Stream(w http.ResponseWriter, r *http.Request) { 


wg := sync.WaitGroup{} 
wg.Add(1) 


go func(){ 
    defer wg.Done() 

db, err := sql.Open("postgres", Postgres_Connect) 
if err != nil { 
    log.Fatal(err) 
    println(err) 

} 
defer db.Close() 

r.ParseForm() 
post := r.FormValue("post") 
profile_id,err := strconv.Atoi(r.FormValue("profile_id")) 
created_on := time.Now() 
for i := 0; i < 10000; i++ { 
    profile_id = profile_id+1 
    on, err := db.Query("insert into streams (post,profile_id,created_on) values ($1,$2,$3)", post, profile_id) 
    defer on.Close() 

    if err != nil { 
     fmt.Fprintln(w, "-1") 
     log.Fatal(err) 
    } 
} 

fmt.Fprintln(w, "1") 

}() 
wg.Wait() 

}

나는 기본적으로 테스트를 위해 다른 프로필 ID를 사용하여 데이터베이스에 10,000 개의 레코드를 삽입하고있다.

+3

당신은 루프 동안'on.Close'을 실행 아닙니다. – JimB

+0

은 WaitGroup을 하나만 만들고 대기 만하면됩니다. 또한 https://play.golang.org/을 소개하고자합니다. 코드를 형식화하면 사람들이 훨씬 더 잘 도와 줄 수 있습니다. 마지막 고려 사항은 당신이 열려, 당신의 코드에서'sql.Open()'한 번만해야하고 가까운 연결을 만들고 연결 풀을 파괴하는 것을 의미한다. –

+0

는 리소스 누수의 원인을 정확히 연기를 실종됐다이며, 내 코드의 형식을 지금 사용됩니다 JimB 주셔서 감사합니다 –

답변

1

는 루프에서 연기 사용하지 마십시오. 함수가 반환 될 때 실행됩니다.