ãã®ãã©ã€ããŒã§ã¯ããã¹ãŠã®HTTPãªã¯ãšã¹ãã«å¯ŸããŠã Open("mysql","...")
ã䜿çšããŠããŒã¿ããŒã¹ãéãããã¹ãŠã®ãªã¯ãšã¹ããµã€ã¯ã«ã®æåŸã«Close()
ã䜿çšããŠããŒã¿ããŒã¹ãéããããšããã¹ããã©ã¯ãã£ã¹ã§ãã
ãŸã
ãªã¯ãšã¹ããµã€ã¯ã«ã«é¢ä¿ãªããäžåºŠéãã ãã§éããªãã§ãã ããã
ã³ãŒãã³ã¡ã³ãã«æ¬¡ã®ããã«æžãããŠããŸãã
DBãã³ãã«ã¯é·å¯¿åœã§ãããå€ãã®ãŽã«ãŒãã³éã§å ±æãããããšãç®çãšããŠãããããDBãéããããšã¯ãã£ãã«ãããŸããã
...ã ããç§ã¯ããŒã ãšæããŸãã ææªã®å Žåãæ倧蚱容ã¢ã€ãã«æ¥ç¶ã®æ§æã«åºã¥ããŠãã¿ã€ã ã¢ãŠãããããèªåçã«éããããŸããïŒ
SetConnMaxLifetimeãåç §ããŠãã ãã
ãŸããhttpïŒ //go-database-sql.org/accessing.html ïŒçªå·ä»ããªã¹ãã®åŸã®éšåïŒãåç §ããŠãã ããã
@benguild SetConnMaxLifetime
ã SetMaxIdleConns
ã SetMaxOpenConns
ãã©ã®ããã«æ§æããŸããã
ããŸããŸãªè² è·æ¡ä»¶ã«åãããŠèšå®ããããã®ãã¹ããã©ã¯ãã£ã¹ã®ååãã©ãã§åŸãããšãã§ãããã«ã€ããŠã®ã¢ã€ãã¢ã¯ãããŸããïŒ
1幎以äžã®éããªã¯ãšã¹ãã®éå§æã«Open()
ãããªã¯ãšã¹ãã®ã©ã€ããµã€ã¯ã«ã®çµäºæã«Close()
ã䜿çšããŠããã®ãã©ã€ããŒã䜿çšããŠããŸããã ããã¯å®ç§ã«æ©èœããŸããã
ãã®ã¢ããã€ã¹ãèããŠãç§ã¯1ã€ã®æ¥ç¶ãéããåç §ãã°ããŒãã«å€æ°ã«æ®ããŠãããã䜿ãç¶ããŸãã ç§ã¯ããã決ããŠéããŸããã
SetConnMaxLifetime
ã SetMaxIdleConns
ã SetMaxOpenConns
èšå®ããŠããŸããã ãããã¯ããã©ã«ãã®ãŸãŸã§ãã
ãã®åçŽãªãã¯ããã¯ã¯ç§ã«ã¯ããŸããããŸããã CloudSQLãžã®ã¢ã¯ãã£ããªæ¥ç¶ã®æ°ã¯ãGoogle AppEngineã®æ¥ç¶å¶éã«éãããŸã§å¢ãç¶ããŸãã ãã®åŸãããŒã¿ããŒã¹ã«æ¥ç¶ã§ããªããªããŸãã
æ¥ç¶ãéããããŠããŸããã
CloudSQLã®Goãµã³ãã«ã¯ãéå§æã«1åã ãOpen()
ãåŒã³åºããŸãïŒ https ïŒ//github.com/GoogleCloudPlatform/golang-samples/blob/master/getting-started/bookshelf/db_mysql.go
ãã®åé¡ã¯CloudSQLã«åºæã®ãã®ã§ããããã©ã€ããŒèªäœã«é¢é£ããŠããã®ã§ã¯ãªãã§ããããã
ãã¶ã@broadyã¯ããã€ãã®æŽå¯ãæã£ãŠããŸããïŒ
ããŠãç§ã¯ä»éããŠããŸããã ãããåé¡ãå§ãŸã£ãæã§ãã
ãã®ãµã³ãã«ã³ãŒãã¯ãæ¥ç¶ãé·ç¶ãããããšãç解ããŠäœæããŸããã ç§ã¯å®éã«æ¬çªã¢ããªã§Goã®SQLã䜿çšããããšããããŸããã
ã¿ã€ã ã¢ãŠãïŒãããã£ãŠãå®æçãªããŒãã¢ã©ã€ãpingãå¿ èŠïŒãåå ã§åæãããŠããŸããããããšããœã±ãããå£ããŠããããã«åæãããŠããŸããïŒ
誰ããããåŠçããå¿ èŠããããŸããïŒ ãã©ã€ããŒãŸãã¯ãŠãŒã¶ãŒïŒ
å®ã¯ãç§ãèšã£ãããšã¯ããŸãæå³ããããŸããã sqlããã±ãŒãžã¯ãããŒã«å ã®äžæ£ãªæ¥ç¶ãåŠçããå¿ èŠããããŸãã ãã®åé¡ããã®ãã©ã€ããŒã«éå®ããŸãããããããšãdatabase / sqlã®ãã°ã§ããïŒ
@pjebsæ¥ç¶ãéããçŽåŸã«ããããåŒã³åºããŠããŸãã
æ£çŽãªãšããããããã®ãã©ã¡ãŒã¿ãŒïŒ SetMaxOpenConns
ïŒãèšå®ããªããšãå¿
èŠãªæ°ã®æ¥ç¶ã確ç«ãããããã§ãã SetConnMaxLifetime
ã5åãŸãã¯10åã«èšå®ããŠãæ¥ç¶ãéãããããã©ããã確èªããŸãããïŒ
æ¥ç¶ãéãããããã«ããããåŒã³åºããŠã¿ãŠãã ããã
db.DB().SetConnMaxLifetime(time.Minute*5);
db.DB().SetMaxIdleConns(0);
db.DB().SetMaxOpenConns(5);
ãããŸã§ã«5æ¥ç¶ãè¶ ããŠãããã©ãããããã³æ¥ç¶ã®ããããã5åãè¶ ããŠã¢ã€ãã«ç¶æ ã«ãªã£ãŠããªããã©ããã確èªããŸãã ãç¥ããäžããã 䜿çšå¯èœãªããŒã«ã«ã¢ã€ãã«ç¶æ ã®æ¥ç¶ããªãå Žåã¯ãã³ã°ãããšæããŸãããã³ãŒããèªãã§ããªãããããã®å Žåã¯å€±æããå¯èœæ§ããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«åé¡ãããã®ã§ã¯ãªãããšæããŸãã ãã³ãã©ãŒãçµæã»ãããéããŠããªãå Žåãæ¢åã®æ¥ç¶ããŸã 䜿çšãããŠããããããã©ã€ããŒã¯ãŸããŸãå€ãã®æ¥ç¶ãéãå¿ èŠããããŸãã ãªã¯ãšã¹ãããšã«æ¥ç¶ãéããããéããããããããšãé²è¡äžã®ã¯ãšãªã«ãã£ãŠéãããŸãŸã«ãªã£ãŠããæ¥ç¶ãçµäºãããããæ¥ç¶ãç©ã¿éãªãããšã¯ãããŸããã
ããã¯ãåäžã®ã°ããŒãã«æç¶çæ¥ç¶ãžã®åãæ¿ãã§åé¡ãçºçããçç±ã説æããŠããŸãã
ãŸãã @ pjebsã¯ãã³ãŒãã®ã©ããã«å¶ç¶ã«è¿œå ã®ããŒã¿ããŒã¹ããŒã«ãäœæããŠããªãããšãïŒæããã«ïŒç¢ºèªããŠãã ããã ã©ããã«æ°ããããŒã«ãå²ãåœãŠãããŠããå Žåãåé¡ããã£ãããšçºçããå¯èœæ§ããããŸãã 以åã«defer db.close()
ãåŒã³åºããŠããå Žåããã®ãããªãã®ã¯æ€åºãããªãå¯èœæ§ããããŸããã以åã®ã³ãŒãã䜿ãæšãŠã§ããããšã«åºã¥ããŠããŸã£ããæ°ããããŒã«ãäœæ/éãããŠããå Žåãããããã«æãããŸãã¹ã¿ã€ã«ã®ã
ããŒã¿ããŒã¹æ¥ç¶ã®åŸ ã¡æéãããã»ã©æªããªããåŸã§ããŒã«ã®å²ãåœãŠãæ£åžžã«è§£é€ãããéããåãªã¯ãšã¹ãã¡ãœããã§ã®ééãæ©èœããŸãããã»ãšãã©ã®èšå®ã§ã¯ã2ã€ã®å¥ã ã®ã¢ããªã±ãŒã·ã§ã³ããªãéããããŒã«ã䜿çšããæ¹ãè¯ããšæããŸãã tïŒããšãã°ïŒå€ãã®æ¥ç¶ãé·æééãããŸãŸã«ããŠãããšãã¢ã€ãã«ç¶æ ã§ãã£ãŠããä»ã®æ¥ç¶ãäžéšãå²ãåœãŠãã®ããããã¯ããå¯èœæ§ããããŸãã
@dgryskiãããç§ãããæã£ãŠããŸããïŒäžèšãåç §ïŒã åäžã®äœ¿çšããä¿æãããããŒã«ãžã®åãæ¿ãäžã«ãå¥ã®ããŒã«ãã³ãŒãã®ã©ããã«äœæãããŠããŠãå²ãåœãŠã解é€ãããŠããªãå Žåãªã©ããããŸãã
é¢é£ããå¥ã®åé¡ïŒ
以åã®æ¹æ³ã§ã¯ããããã°ã®ç®çã§ãããè¡ãããã«äœ¿çšããŸãïŒå€éšããŒå¶çŽãšã©ãŒãåé¿ããããïŒã
db.Exec("SET foreign_key_checks = 0;")
_, err := db.Exec("INSERT IGNORE INTO " + c.Q_VALENTINES_PIVOT_CUSTOMER_EVENT + " (customer_id, event_id, gender, allocated_group, session_1, session_2, public_name, profile_photo, registered_time) VALUES " + values + ";")
if err != nil {
db.Exec("SET foreign_key_checks = 1;")
return err
}
db.Exec("SET foreign_key_checks = 1;")
ããã¯åžžã«åäœããããã«äœ¿çšããŸãã
ãæ¥ç¶ããŒã«ãã䜿çšããŠããã®ã§ãããã¯æ©èœããŸããã
https://github.com/go-sql-driver/mysql/issues/208 ïŒãããçç±ã説æããŠããŸãã åãæ¥ç¶ã䜿çšãããšããä¿èšŒã¯ãªãã SET
ã¯ã»ãã·ã§ã³ã«ã®ã¿èšå®ãããŠãããããå¿
ãããã¡ã€ã³ã¹ããŒãã¡ã³ãã«é©çšããããšã¯éããŸããã
ãšããäºã¯æ¿ç¥ããŠããŸãã ããããã©ãããŠãããç§ã®ä»¥åã®æ¹æ³ã§æ©èœããã®ã§ããããã ç§ã¯åžžã«æ°ããæ¥ç¶ãäœæããèŠæ±ãµã€ã¯ã«ã®çµããã«ãããéããŸããããäœæãããæ¥ç¶ãã¯åŒãç¶ãæ¥ç¶ããŒã«ãå©çšããŸããïŒ
@pjebsæ¥ç¶ããŒã«ã¯è€æ°ã®æ¥ç¶ãéãå¯èœæ§ããããŸãã äžåºŠã«1ã€ã®æ¥ç¶ã®ã¿ãå¿ èŠãªå Žåã¯ã1ã€ã®æ¥ç¶ãç¶æããŸãã 以åã®ã±ãŒã¹ã§ã¯ãåãããŒã«ã§2ã€ã®ããŒã¿ããŒã¹èŠæ±ãåæã«çºçããããšã¯ãªãã£ãããã1ã€ã®æ¥ç¶ãã確ç«ãããŸããã§ããã ãããã£ãŠããã¹ãŠã®Execã¯åãæ¥ç¶ã§çºçããŸããã é©åãªããŒã«ã«ç§»åãããšãããã¯åœãŠã¯ãŸããŸããã
ããå€ãã®ã³ãŒããèŠãããšãã§ããã°ãããã¯ãããã°ã容æã«ãªããŸãã
@pjebsããŒã¿ããŒã¹ãã©ã³ã¶ã¯ã·ã§ã³ãšããŠãããå®è¡ããŠãåãæ¥ç¶ã«ç¢ºå®ã«ãããããããã«ããå¿ èŠããããŸãïŒhttpïŒ //jinzhu.me/gorm/advanced.html#transactions
ãªããããããªãã®èšãããšãããŠããã®ãã¯ããããŸããããã¹ããŒãã¡ã³ãã®èŠæ±ããšã«ç°ãªãæ¥ç¶ã䜿çšããããšã¯å®å šã«ã©ã€ã³ããå€ããŠããããã§ã¯ãããŸããã ããã¯ãããŒã«ãã®èåŸã«ããäžçš®ã®èãæ¹ã§ã...ãªã¯ãšã¹ããè¡ã£ãŠãããã®ãå¿ ããããããããåæã«åäœãããªã¯ãšã¹ããå€æ°ååšããå¯èœæ§ãããããšãèãããšã åäžã®æ¥ç¶ããã®åç¶æéå šäœã«ããã£ãŠåäžã®èŠæ±ã®ããã«äºçŽãããã®ã¯ã¡ãã£ãšã°ãããŠããã§ãããããããã§ãã ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³å ã§æ¥ç¶ã亀æããããšã¯å®å šã«ã©ã€ã³ããå€ããŸãã æ§æãã©ã¡ãŒã¿ãŒãå€æŽãããšãã³ãŒãã®ä»ã®éšåããã®ä»ã®ã¯ãšãªãä»ã®èŠæ±ã«åœ±é¿ãäžããå¯èœæ§ããããããå®è¡ããŠããããšã¯å®éã«ã¯ãã©ã³ã¶ã¯ã·ã§ã³å ã«ããå¿ èŠããããŸãã çŸåšæžãããŠããæ¹æ³...ã³ãŒãããããã¯ã«ãªã£ãå Žåããã®ç¹å®ã®æ¥ç¶ã§å ã«æ»ãããããšã¯ãããŸããïŒ ãã®ç¹ã§ããã©ã³ã¶ã¯ã·ã§ã³ãçµäºããªãå ŽåïŒããšãã°ãã¯ã©ãã·ã¥/ãããã¯ãçºçããå ŽåïŒã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®ããŒã«ããã¯ã延æããããã«ããŠãã ãããããããªããšãããŒã¿ããŒã¹æ¥ç¶ããã³ã°ããããå¥ã®ããã»ã¹ããã®ããŒã¿ããŒã¹æ¥ç¶ãæ¡çšããŠéå§ãããããå¯èœæ§ããããŸããã³ããããããªããããªãã©ã³ã¶ã¯ã·ã§ã³ãžã®å€æŽãªã©â https://github.com/jinzhu/gorm/issues/1056
@broadyã®ã³ãŒãã§æ°ã¥ããŸããïŒ https ïŒ//github.com/GoogleCloudPlatform/golang-samples/blob/master/getting-started/bookshelf/db_mysql.go#L82
æ¥ç¶ãéããåŸãããã«Ping()
ãåŒã³åºããŠãæ¥ç¶ããŸã å¿çããŠãããã©ããããã¹ãããŸãã
ããã§ãªãå Žåã圌ã¯ãã ãããŸãã ä»ã«ã§ããããšã¯ãããŸããïŒ ããäžåºŠéããŠã¿ãã¹ãã§ããïŒ
https://godoc.org/github.com/garyburd/redigo/redis#Poolã©ã€ãã©ãªã§ã¯ãåªããããŒã«ãå®è£
ãããŠããŸãã
TestOnBorrow
ãšããåªããé¢æ°ããããå°ãäžã®äŸã§ã¯Ping()
ãå®è¡ããŸãã
ãã®ãã©ã€ããŒã«äŒŒããããªãã®ã¯ãããŸããïŒ
@pjebså®éã®çŸåšã®åé¡ã¯äœã§ããïŒ
Ping()
ãå®è£
ããã¿ã€ãã³ã°ãšãPingã倱æããå Žåã®å¯ŸåŠæ¹æ³ã«é¢ãããã¹ããã©ã¯ãã£ã¹ã«ã€ããŠå°ããã ãã§ãã
ãããªãã»ã©ã ç§ãç¥ãéããããªãã¯ããããå¿ èŠã¯ãªãã¯ãã§ã...ïŒ ããããããŒã«ã«ãŸã æ¥ç¶ãåæãããŠããå Žåã¯...å¿ èŠãšæãããŸãã
ééããªãPingããå¿
èŠããããŸãã 圌ãã¯redigo
ïŒãªã³ã¯ã®äžïŒãš@broadyã®ã³ãŒãã§ãããè¡ããŸãã
db.Exec("SELECT 1+1")
ã¯PINGãšããŠäœ¿çšã§ããŸãã
ãééããªããPingããå¿ èŠããããŸããïŒ ããã¯æå³ããããŸãã...æ¥ç¶ãæå¹ã§ãªãå Žåã¯ã©ããªããŸããïŒ äžæ¢ããŸããããããšãåè©Šè¡ããŸããïŒ
.Ping
çžåœããã¯ãšãªåŒã³åºããèªåçã«å®è¡ããªãã®ã¯ãªãã§ããïŒ
db.ExecïŒ "SELECT 1 + 1"ïŒã¯PINGãšããŠäœ¿çšã§ããŸãã
ã§ã¯ããªãç§ãã¡ã¯ééããªã.Ping
ããå¿
èŠãããã®ã§ããããã
Ping
ã¯ãæ¥ç¶ãšèªèšŒãæå¹ã§ããããšãæ€èšŒããŸãã æåã®ãªã¯ãšã¹ãããããããŒã«ã®ç¢ºç«ã«å€±æããã»ãããããšæããŸãã
åè©Šè¡ã§ãããšæããŸãããåé¿ããŠããé害ç¶æ ã¯äœã§ããïŒ æªããããã¯ãŒã¯æ¥ç¶ïŒ
@benguild db.Ping()
ã¯ãã®ã©ã€ãã©ãªã䜿çšããŸããã
ãŽãŒãããããã©ãŒã©ã ã«è¡ãã®ã¯ã©ãã§ããïŒ
ã¯ããæã
ãè¿ãããããŒã«ãããæ¥ç¶ã®1ã€ãäžè¯ã§ãã çŸåšãç§ã¯pingãåŒã³åºããpingã倱æããå Žåã¯ãæ瀺çã«close
ãéããŠãããã¯ãšãªãéããŠåè©Šè¡ããŸãïŒããã¥ã¡ã³ãã«èšèŒãããŠããããã«ããã®ã©ã€ãã©ãªã®pooling
æ©èœã§ãããæå³ãããŠãããã©ããã¯ããããŸãããéžã¶ã
@broady ãããããŸããããã£ãšçã«ããªã£ãŠããŸã... [ããŒã«]ã«çãŸããšã¯æããªãã£ãããããŒã«ããçºä¿¡è
ãžã®æ¥ç¶ãåæããããšã¯æããŸããã§ããã @pjebsåèãŸã§ã«ãç§ãã¡ã¯äž¡æ¹ãšãGORM
ã䜿çšããŠããããšãç¥ã£ãŠããŸãããããŠããã¯å®éã«ã¯gorm.Open()
ã®çµããã«ãããè¡ããŸãïŒ
if err == nil {
err = db.DB().Ping() // Send a ping to make sure the database connection is alive.
}
OKããã®ç¹å®ã®ã©ã€ãã©ãªã.Ping
ãè©Šè¡ããããšãèæ
®ããŸããããã以å€ã®å Žåã¯å€±æããå Žåã«åè©Šè¡ããŸããïŒåã«ãšã©ãŒãè¿ããŸãïŒ....劥åœãªã¬ãã«ã®å Žåããã®ãããªãã®ãå¿
èŠã«ãªãå¯èœæ§ããããŸããã®ãã©ã€ããŒãšã®æŽåæ§ïŒ
for databaseConnectionAttemptLoop := 0; databaseConnectionAttemptLoop<4; databaseConnectionAttemptLoop++ {
err=nil; // NOTE: If there is an error, the loop will continue and replace the value for "err" with each attempt. This will continue until the maximum number of attempts have been made... at which point the loop simply exits and the error is returned at the end of the function.
if db, err = gorm.Open(/* database connection string... NOTE: This function attempts `.Ping` on its own. */))); err == nil && db != nil {
/* configure connection */
}
////
if (err==nil) {
break; // Here, if there is no error, it simply breaks out and does not retry again.
}
}
æªãæ¥ç¶ãæå³çã«è¿ãããå¯èœæ§ãããå ŽåãçŸåšäœãæåŸ ããããã¯ããããŸããã
çŸåšãPingã倱æããå ŽåïŒéåžžã¯æ¥ç¶äžè¯ãåå ïŒãåè©Šè¡ã®éã«ããããªtime.sleep()
ã眮ããŠãåæ¥ç¶ãè©Šè¡ãããšãã«ç¡éã«ãŒããå®è¡ããŸãã Google App Engineã¯ã60ç§ã®ãªã¯ãšã¹ããŠã©ããããã°ã¿ã€ããŒã®æéãåãããšãªã¯ãšã¹ããç Žæ£ãããããå®éã®ç¡éã«ãŒãã®å±éºã¯ãããŸããã
ããŒãããããããã©ããã¯ããããŸããâ
time.sleep()
ã¯è¯ãããã«èãããŸãããæ倧5åçšåºŠè©ŠããŠã¿ãŸãã ããã¯ã¹ãåæ³çã«ããŠã³ãŸãã¯éè² è·ã«ãªã£ãŠããå Žåã60ç§éãã³ã°ããŠãããªã¯ãšã¹ããå€ããšãWebãµãŒããŒãã¯ã©ãã·ã¥ãããã䜿çšæãé«é¡ã«ãªãå¯èœæ§ããããŸãã
ãããç§ãçŸåšãã¹ãã®ããã«è¡ã£ãŠããããšã§ãã å®çšŒåç°å¢ã§ã¯å®è¡ãããŸããã è©Šè¡åæ°ã«å¶éãèšããŸãã
ãããããããšã«ãç§ã¯1å以äžã¯ã©ãŠãSQLãããŠã³ããŠããã®ãèŠãããšããããŸããã
Googleã®SREããã¯ã¯ãã©ã³ãã åãããææ°ããã¯ãªãã§æ倧3åã®è©Šè¡ãææ¡ããŠãããããã»ã¹ããšã®ã°ããŒãã«ãªåè©Šè¡äºç®ã¯10ïŒ ã§ãã é話ã®10ïŒ ä»¥äžã倱æãå§ããå Žåã¯ãåè©Šè¡ãåæ¢ããŠãã ããã
ãããããã ããããšã@dgryski ã SREã®æ¬ã¯ã©ãã«ãããŸããïŒ
https://books.google.com.au/books?id=81UrjwEACAAJ&redir_esc=y
ç§ã¯ãããè²·ããªããã°ãªããªãããã§ãã
@dgryski ãã°ããŒãã«ãªããã»ã¹ããšã®åè©Šè¡ããžã§ããããšã¯ã©ãããæå³ã§ããïŒ
@ãã³ã®ã«ã
db.DB().SetConnMaxLifetime(time.Minute*5);
db.DB().SetMaxIdleConns(0);
db.DB().SetMaxOpenConns(5);
ãã®ã¹ããããã³ãŒãã䜿çšããŠãè€æ°ã®goruntimeã䜿çšãããšããšã©ãŒãçºçããŸãã
(dial tcp 127.0.0.1:3306: connect: can't assign requested address)
https://github.com/jinzhu/gorm/issues/1898ãåç §ããŠãã ãã
æ¥ç¶ãéãããããã«ããããåŒã³åºããŠã¿ãŠãã ããã
db.DB().SetConnMaxLifetime(time.Minute*5);
db.DB().SetMaxIdleConns(5);
db.DB().SetMaxOpenConns(5);
ããã解決ããŸãã
1幎以äžã®éããªã¯ãšã¹ãã®éå§æã«
Open()
ã䜿çšãããªã¯ãšã¹ãã®ã©ã€ããµã€ã¯ã«ã®çµäºæã«Close()
ã䜿çšããŠããã®ãã©ã€ããŒã䜿çšããŠããŸããã ããã¯å®ç§ã«æ©èœããŸããããã®ã¢ããã€ã¹ãèããŠãç§ã¯1ã€ã®æ¥ç¶ãéããåç §ãã°ããŒãã«å€æ°ã«æ®ããŠãããã䜿ãç¶ããŸãã ç§ã¯ããã決ããŠéããŸããã
SetConnMaxLifetime
ãSetMaxIdleConns
ãSetMaxOpenConns
ãèšå®ããŠããŸããã ãããã¯ããã©ã«ãã®ãŸãŸã§ãããã®åçŽãªãã¯ããã¯ã¯ç§ã«ã¯ããŸããããŸããã CloudSQLãžã®ã¢ã¯ãã£ããªæ¥ç¶ã®æ°ã¯ãGoogle AppEngineã®æ¥ç¶å¶éã«éãããŸã§å¢ãç¶ããŸãã ãã®åŸãããŒã¿ããŒã¹ã«æ¥ç¶ã§ããªããªããŸãã
æ¥ç¶ãéããããŠããŸããã
proxysqlãžã®æ¥ç¶ã§åãåé¡ãçºçããŸãã é«è² è·ã®æ¬çªããŒãã«æ¬¡ã®æ§æãèšå®ããŸããã
max_idle: 1
max_open: 100
max_life_time: 5s
write_timeout: 5s
read_timeout: 3s
connection_timeout: 10s
ããããdbããŒãã®æ¥ç¶æ°ã確èªãããšã TIME_WAIT
ç¶æ
ã§21kãè¶
ããæ¥ç¶ã衚瀺ãããŸãã
æãåèã«ãªãã³ã¡ã³ã
@pjebsæ¥ç¶ãéããçŽåŸã«ããããåŒã³åºããŠããŸãã
æ£çŽãªãšããããããã®ãã©ã¡ãŒã¿ãŒïŒ
SetMaxOpenConns
ïŒãèšå®ããªããšãå¿ èŠãªæ°ã®æ¥ç¶ã確ç«ãããããã§ããSetConnMaxLifetime
ã5åãŸãã¯10åã«èšå®ããŠãæ¥ç¶ãéãããããã©ããã確èªããŸãããïŒæ¥ç¶ãéãããããã«ããããåŒã³åºããŠã¿ãŠãã ããã
ãããŸã§ã«5æ¥ç¶ãè¶ ããŠãããã©ãããããã³æ¥ç¶ã®ããããã5åãè¶ ããŠã¢ã€ãã«ç¶æ ã«ãªã£ãŠããªããã©ããã確èªããŸãã ãç¥ããäžããã 䜿çšå¯èœãªããŒã«ã«ã¢ã€ãã«ç¶æ ã®æ¥ç¶ããªãå Žåã¯ãã³ã°ãããšæããŸãããã³ãŒããèªãã§ããªãããããã®å Žåã¯å€±æããå¯èœæ§ããããŸãã