2016-11-10 12 views
0

私はGolang/Postgresを初めて使用しています。私はいくつかのテストを行っており、pqを取得しています:申し訳ありませんが、あまりにも多くのクライアントが既にエラーです。その後、私はエラーを取得する私のpostgresインスタンスは100の接続の最大に設定されていると私は、私は通常、約60〜70のインサートに取得することができ、このコードgolang postgres too many connections error

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つのサンプルから来ています。私は何が間違っていることができます、ここで私の完全なコードです。私の知る限り、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を1つしか作成せず、ただ待つだけです。また、https://play.golang.org/を紹介したいので、コードを書式設定することができます。そうすれば、人々はあなたをより良く助けることができます。最後に、すべてのコードで 'sql.Open()'を一度だけ実行する必要があります。接続のオープンとクローズは、接続プールの作成と破棄を意味します。 –

+0

JimBありがとうございました。遅延を逃していたものがリソースリークを引き起こしました。これを使用してコードをフォーマットします –

答えて

1

ループでdeferを使用しないでください。 関数が戻るときに実行されるためです。

関連する問題