db.sqlDB.Query ()λ₯Ό νΈμΆ ν λ "Too man connections"λΌλ μ€λ₯ λ©μμ§κ° λνλ©λλ€. μ΄ λ¬Έμ λ₯Ό μμΈν μ΄ν΄λ³΄κΈ° μ μ μλ €μ§ λ¬Έμ κ° μλμ§ κΆκΈν©λλ€.
μκ°?
013/07/23 03:05:35 yy.UpdateThingy () db.go : 264 [XXXXμ λ μ½λ μ½μ μ€ν¨ : μ€λ₯ 1040 : μ°κ²°μ΄ λ무 λ§μ]
go λ²μ 1.1.1μ μ¬μ©νκ³ μμ΅λλ€.
go λ²μ go1.1.1 linux / 386
mysql λλΌμ΄λ² λ²μ μ μ¬μ©νκ³ μμ΅λλ€.
v1.0.1
MySql λ²μ :
μλ² λ²μ : 5.5.22-0ubuntu1 (Ubuntu)
λ€μμ λ΄ μΏΌλ¦¬ μ€ νλμ μνμ
λλ€.
ν, μ€λ₯ =
db.sqlDB.Query ( "XXXX (yyyy) κ° (?)μ μ½μ
",
connect.ZZZZ)
if err! = nil {
_ = rows.Close ();
λ°ν κ²°κ³Ό, μ€λ₯
}
_ = rows.Close ();
λ¬Έμ κ° ν΄κ²°λκΈ°λ₯Ό λ°λΌλ©΄μ "rows.Close ()"λ₯Ό μΆκ°νμ§λ§ μ£Όμ¬μλ μμ΅λλ€.
μ°Έκ³ λ‘, λ΄ μΏΌλ¦¬ μ€ μΌλΆλ "rows.Scan"μ μ¬μ©νκ³ μΌλΆλ μ¬μ©νμ§ μμ΅λλ€.
https://github.com/VividCortex/go-database-sql-tutorial μμ μ΄ν΄λ³΄μμμ€.
.Queryλ₯Ό μ¬μ©νμ§ λ§κ³ .Execμ μ¬μ©νμμμ€.
λμ λ°μ΄ν°λ² μ΄μ€ μ‘μΈμ€κ° λ무 λ§μ΅λλ€. μ΄ κ²½μ° λ°μ΄ν°λ² μ΄μ€ / SQL ν¨ν€μ§κ° ν₯ν λ²μ μμ μ°¨λ¨ λ©μ»€λμ¦μ μ 곡 ν λκΉμ§ λμ μ°κ²° μλ₯Ό μλμΌλ‘ μ νν΄μΌν©λλ€. κ·Έλ¬λ λ§μ κ²½μ° μΊμ± / λΉλκΈ° μ λ°μ΄νΈκ° λ λμ λμμ΄ λ κ²μ λλ€.
μλ§λ νλ‘κ·Έλ¨μ΄ λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ λμΆνκ³ μμ κ²μ
λλ€. λΉμ μ κ°κΉμ΄νμ§ μλ κ²½μ°μ λ°μν©λλ€ rows
μ μν΄ λ°ν db.Query
λλ (μ κ±°λλ₯Ό μ’
λ£νλ κ²μ μμλ€ λ°μ΄ν°λ² μ΄μ€ / SQLμ TX APIλ₯Ό ).
λμ μΌλ°μ μΈ μ‘°μΈμ
db.Exec
(μ¦, Scan
μ무κ²λ μμ). μ°κ²°μ μ€ν ν μ¦μ 무λ£μ
λλ€.db.QueryRow
. μ°κ²° ꡬ문 μ μ¬μ©νλ©΄ db.Query
. λ°ν λ λͺ¨λ ν ( rows.Next
λ°λ³΅)μ μ½κ±°λ rows.Close
νΈμΆνμ¬ μ°κ²°μ "ν΄μ "νλ κ²μ΄ λ§€μ° μ€μν©λλ€. νμ€ν rows.Close
ν΅νλ₯Ό μ°κΈ°νλ κ²μ μ’μ μκ°μ
λλ€. μ€λ₯ μ¬λ‘ λ±μ μμ§ λ§μμμ€."db.Query ()"λ₯Ό "db.Prepare () λ° db.Exec ()"λ‘ λ³κ²½νμ¬ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€. λΉ λ₯΄κ³ νλ₯ν λ΅λ³μ κ°μ¬λ립λλ€.
λλ μμ.
κ·Έλ¦¬κ³ "db.Prepare () λ° db.Exec ()"λ₯Ό μ¬μ©ν©λλ€.
var db * sql.DB
func getdb () * sql.DB {
db, μ€λ₯ = sql.Open ( "mysql", connArgs)
db.SetMaxIdleConns (100)
λ°ν db
}
func foo (db * sql.DB) {
μ’ .....
smint, err : = db.Prepare (....)
smint.Close () μ°κΈ°
smint.Exec (....)
}
func main () {
go func () {
db = get_db ()
db.Close () μ°κΈ°
foo (db)
} ()
}
κ°μ 1.3
----- μλ³Έ λ©μμ§ -----
λ³΄λΈ μ¬λ : liutaihua [email protected]
μμ μ : go-sql-driver / mysql [email protected]
μ λͺ© : Re : [mysql] λ무 λ§μ μ°κ²° (# 111)
λ μ§ : 2014 λ
7 μ 16 μΌ 15:43
κ·Έλ¦¬κ³ ... μ λ©μΈμμ κ³ λ£¨ν΄μ μμν©λκΉ?
μ½λκ° μ€μ λ‘ μ΄μ κ°μ΄ 보μΈλ€λ©΄ κ³ λ£¨ν΄μ΄ μ€νλκΈ° μ μ mainμ΄ μ’
λ£ λ μ μμΌλ©° νλ‘κ·Έλ¨μ μ무 μμ
λ μννμ§ μμ΅λλ€.
go func(){
λ° }()
μ κ±°νκΈ° λ§νλ©΄λ©λλ€. λΉμ μ λ λμμ§ κ²μ
λλ€.
λ΄ μ€λͺ μ λν΄ μ£μ‘ν©λλ€. μ€μ λ‘ μ½λ :
func socke_server () {
{
// accept_something_from_socketμ μμ μΌλ‘
go func (some_receive) {
db = get_db ()
db.Close () μ°κΈ°
foo (db)
}
}
}
func main () {
socke_server ()
}
νμ§λ§ μ§κΈμ μ λμ€ λλ©μΈ νλ‘ν μ½ ( ' user : pwd @ unix (/tmp/mysql.sock)/')μ μ¬μ©νκ³ μμ΅λλ€.
κ³ λ§μ λ΅μ₯
κ·Έλ κ²ν΄μλ μλ©λλ€. μλ ν μ μμ§λ§ λ립λλ€.
λ©μΈμ accept-loopλ₯Ό λ£μΌμμμ€.
κ³ λ£¨ν΄μ μ΅μμ ν¨μλ‘ λ³νν©λλ€.
get_db μ½λλ₯Ό λ©μΈ μλ¨μ λ£κ³ db.λ₯Ό λ κ°κΉκ² μ°κΈ°νμμμ€ (κ·Έλ¦¬κ³ κ±°κΈ°μλ§).
μ΄λ κ² dbλ₯Ό μ΄κ³ λ«μ§ λ§μμμ€.
λ€μ μ½λλ₯Ό μλνμμμ€.
func handleConnection(db *sql.DB, args...interface{}) {
// do someting.....
// db.Exec("STATEMENT", args...)
}
func main() {
db, err := sql.Open("mysql", connArgs)
if err != nil {
panic(err)
}
db.SetMaxIdleConns(100)
defer db.Close()
for {
// accept connections and pass relevant stuff to handleConnection
go handleConnection(db, nil)
}
}
κ³ λ§μμ.
κ°μ₯ μ μ©ν λκΈ
μ΅μ 1 : λ무 λμ λμμ±
λμ λ°μ΄ν°λ² μ΄μ€ μ‘μΈμ€κ° λ무 λ§μ΅λλ€. μ΄ κ²½μ° λ°μ΄ν°λ² μ΄μ€ / SQL ν¨ν€μ§κ° ν₯ν λ²μ μμ μ°¨λ¨ λ©μ»€λμ¦μ μ 곡 ν λκΉμ§ λμ μ°κ²° μλ₯Ό μλμΌλ‘ μ νν΄μΌν©λλ€. κ·Έλ¬λ λ§μ κ²½μ° μΊμ± / λΉλκΈ° μ λ°μ΄νΈκ° λ λμ λμμ΄ λ κ²μ λλ€.
μ΅μ 2 : λμ μ°κ²°
μλ§λ νλ‘κ·Έλ¨μ΄ λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ λμΆνκ³ μμ κ²μ λλ€. λΉμ μ κ°κΉμ΄νμ§ μλ κ²½μ°μ λ°μν©λλ€
rows
μ μν΄ λ°νdb.Query
λλ (μ κ±°λλ₯Ό μ’ λ£νλ κ²μ μμλ€ λ°μ΄ν°λ² μ΄μ€ / SQLμ TX APIλ₯Ό ).λμ μΌλ°μ μΈ μ‘°μΈμ
db.Exec
(μ¦,Scan
μ무κ²λ μμ). μ°κ²°μ μ€ν ν μ¦μ 무λ£μ λλ€.db.QueryRow
. μ°κ²° ꡬ문 μ μ¬μ©νλ©΄db.Query
. λ°ν λ λͺ¨λ ν (rows.Next
λ°λ³΅)μ μ½κ±°λrows.Close
νΈμΆνμ¬ μ°κ²°μ "ν΄μ "νλ κ²μ΄ λ§€μ° μ€μν©λλ€. νμ€νrows.Close
ν΅νλ₯Ό μ°κΈ°νλ κ²μ μ’μ μκ°μ λλ€. μ€λ₯ μ¬λ‘ λ±μ μμ§ λ§μμμ€.