2017-11-29 38 views
-3

GINはどのようにして各HTTP要求が一意のDB接続(MySQL接続)を取得することができるかを理解したいと思います。ここにコード例があります。 'db'はグローバルオブジェクトであるため、API router.GET( "/ person /:age" ...はDBへのアクセスを取得します) loadを使用すると、GINは内部的にそうならば、その後、どのようにそれは、各要求は別の接続を取得することを保証しない。いや、それはシングルスレッドimnplementationある場合。誰もが私の理解を修正してくださいでした。Gin + Golang + DB接続プール

package main 

import (
    // "bytes" 
    "database/sql" 
    "fmt" 
    "github.com/gin-gonic/gin" 
    _ "github.com/go-sql-driver/mysql" 
    "net/http" 
) 

func checkErr(err error) { 
    if err != nil { 
     panic(err) 
    } else { 
     fmt.Println("successful...") 
    } 
} 

func main() { 
    db, err := sql.Open("mysql", "abfl:[email protected](127.0.0.1:3306)/abfl?charset=utf8") 
    checkErr(err) 
    defer db.Close() 
    // make sure connection is available 
    err = db.Ping() 
    checkErr(err) 
    type User struct { 
     age int 
     name string 
    } 
    router := gin.Default() 
    // Add API handlers here 
    // GET a user detail 
    router.GET("/person/:age", func(c *gin.Context) { 
     var (
      user User 
      result gin.H 
     ) 
     age := c.Param("age") 
     fmt.Println("input age : '%d'", age) 
     row := db.QueryRow("select age, name from user where age = ?", age) 
     err = row.Scan(&user.age, &user.name) 
     fmt.Printf("user : %+v\n", user) 
     if err != nil { 
      // If no results send null 
      result = gin.H{ 
       "user": nil, 
       "count": 0, 
      } 
     } else { 
      result = gin.H{ 
       "age": user.age, 
       "name": user.name, 
       "count": 1, 
      } 
     } 
     c.JSON(http.StatusOK, result) 
    }) 
    router.Run(":3000") 
} 
+2

コードを正しくフォーマットしてください。最初に投稿されたように、それは完全に判読不能でした。私はそれを編集しましたが、将来は投稿するときにこれをしてください。 –

+0

本当にありがとうございます。なぜ私の質問は-2となっているのですか?それは無効な質問ですか?私は答えを探しています。 – siddhusingh

+1

なぜリクエストごとに別々の接続が必要ですか?実際、良いフレームワークではデータをキャッシュできるので、ページの読み込みにはデータベースへのアクセスが含まれない可能性があります。また、dbドライバには独自の接続プールがあります。したがって、Webリクエストとdbリクエストの間に直接の関連はありません。 –

答えて

0

各HTTP要求のための新しいSQL接続の確立します
ユーザ管理可能な接続プールはまだありませんが、実装によって内部的に処理されます。
sql.DBはすぐに使用する準備ができています今のところ、心配はありません。
GINはSQL接続とはまったく関係ありません。クエリ/トランザクションを適切に処理することは、あなたの責任です。

+0

私は上記の私の質問のコピー貼りです:私が探しているもの:どのようにこのフレームワーク(ジン)で 'prepared-statement'を利用することです。 REST API呼び出しがステートメントを準備するたびに機能しているとは思っていません。それは非常に非効率的であろう。適切なロジックは、準備されたステートメントを作成する際に、接続と緊密に結びついているはずです。今、接続プールを使用して、prep-stmtハンドルを実際に使用したい場合は、各stmtのマップにユニークなdb接続を設定する必要があります。今質問は:それはGINによって提供されるかどうかです – siddhusingh

+0

いいえ、それはありません。 GinはWebツールであり、HTTPトランスポート層の下には何もしません。 –