2017-11-29 72 views
-3

GIN이 각 HTTP 요청이 고유 한 DB 연결 (MySQL 연결)을 얻는 방법을 알고 싶습니다. 다음은 하나의 예제 코드입니다. 'db'는 전역 개체이므로 API 라우터 .GET ("/ person/: age"... DB에 액세스합니다.) 로드가되면 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 드라이버에는 자체 연결 풀이 있습니다. 따라서 웹 요청과 db 요청 간에는 직접적인 연관성이 없습니다. –

답변

0

각 HTTP 요청에 대한 새로운 SQL 연결 설정 너무 무겁고 의미가 없습니다.
사용자 관리 가능한 연결 풀이 아직 없으며 go 구현 방식으로 내부적으로 처리됩니다.
sql.DB은 사용할 준비가되었습니다. 현재는 걱정할 필요가 없습니다.
그리고 GIN은 SQL 연결과 전혀 관련이 없습니다. 쿼리/트랜잭션을 올바르게 처리하는 것은 전적으로 귀하의 책임입니다.

+0

여기에 복사 - 붙여 넣기 위에 언급 한 내 질문 : 찾고 무엇 :이 프레임 워크 (진) 함께 'prepared-statement'활용하는 방법입니다. REST API 호출이 명령문을 준비 할 때마다 작동하지 않기를 바랍니다. 어느 쪽이 매우 비효율적일까요? 적절한 논리는 준비된 문을 생성하는 동안 연결과 밀접하게 연결되어야합니다. 이제 우리가 연결 풀을 사용하고 prep-stmt 핸들을 사용하기를 원한다면 각 stmt의 맵에 고유 한 db 연결이 있어야합니다. 이제 문제는 GIN에 의해 ​​제공되는지 여부입니다. – siddhusingh

+0

아니요. Gin은 웹 도구이며 HTTP 전송 계층 아래에는 아무 것도 수행하지 않습니다. –