μλ²: MySQL 5.6
μ μ₯λ νλ‘μμ :
DELIMITER //
CREATE PROCEDURE slowInsert(IN t int)
BEGIN
SELECT SLEEP(t);
INSERT INTO `table_x` (message) VALUES (UUID());
END //
DELIMITER ;
μ½λ μ΄λ:
package main
import (
"context"
"database/sql"
"time"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "<url>")
if err != nil {
panic(err)
}
db.SetConnMaxLifetime(9 * time.Second)
db.SetMaxIdleConns(12)
db.SetMaxOpenConns(12)
ctx := context.Background()
ctx, cancel := context.WithTimeout(ctx, time.Duration(3)*time.Second)
defer cancel()
_, err = db.ExecContext(ctx, "call slowInsert( 10 )") // context will cancel before insert occurs
if err != nil {
panic(err)
}
}
μ΄μν νλμ νκ³ μμ΅λλ€.
mysql ν΄λΌμ΄μΈνΈ(μ: νμ νλ‘)μμ slowInsert( 10 )
λ₯Ό μ€νν λ μ½μ
μ μ 10μ΄ λκΈ°κ° μ‘΄μ€λ©λλ€. μ μ₯λ νλ‘μμ κ° μλͺ»λμκ±°λ μ ν¨νμ§ μλ€κ³ λ―Ώμ μ΄μ κ° μμ΅λλ€.
μμ Go μ½λλ₯Ό μ€ννλ©΄ 컨ν
μ€νΈκ° 3μ΄ νμ μ·¨μλ©λλ€. λͺ¨λ μ’μ΅λλ€.
... κ·Έλ¬λ μ¦μ μ½μ
μ΄ λ°μν©λλ€. (10μ΄λ₯Ό κΈ°λ€λ¦¬μ§ μμ΅λλ€.)
μ΄μ μ μ₯λ νλ‘μμ λ₯Ό λ€μκ³Ό κ°μ΄ λ³κ²½νλ©΄
DELIMITER //
CREATE PROCEDURE slowInsert(IN t int)
BEGIN
SELECT SLEEP(t/2); // <---- The change
SELECT SLEEP(t/2); // <---- The change
INSERT INTO `table_x` (message) VALUES (UUID());
END //
DELIMITER ;
Go μ½λλ μλ²½νκ² μλνκ³ μΏΌλ¦¬λ₯Ό μ·¨μν©λλ€(μ¦, μ½μ
μ΄ λ°μνμ§ μμ).
λ κ²½μ° λͺ¨λ mysql ν΄λΌμ΄μΈνΈ(sequel pro)λ λκΈ° κΈ°κ°μ μ‘΄μ€νλ―λ‘ λ μ μ₯λ νλ‘μμ κ° λμΌν©λλ€.
κ·Έλ¬λ Go μ½λμμ λ λ²μ§Έ μ μ₯λ νλ‘μμ λ μλνμ§λ§ 첫 λ²μ§Έλ μλνμ§ μμ΅λλ€. μ΄λ λλΌμ΄λ²μ μ΄μν λ²κ·Έκ° μλ€λ λ―ΏμμΌλ‘ μ΄μ΄μ§λλ€.
@ μλ μμ€ ν룸보
λ²κ·Έκ° μλλλ€. μμ§ μΏΌλ¦¬ μ·¨μλ₯Ό μ§μνμ§ μμ΅λλ€.
κ·Έλ¦¬κ³ SLEEP()
λ λ§€μ° νΉλ³ν 쿼리μ
λλ€. μ°κ²°μ΄ νμ± μνμΈμ§ μ¬λΆλ₯Ό νμΈν©λλ€.
μΌλ°μ μΌλ‘ MySQLμ μΏΌλ¦¬κ° μλ£λ λκΉμ§ μ°κ²°μ νμΈνμ§ μμ΅λλ€.
μ½μ΄λ³΄κΈ°: https://github.com/go-sql-driver/mysql#contextcontext -support
Go 1.8 added database/sql support for context.Context. This driver supports query timeouts and cancellation via contexts. See context support in the database/sql package for more details.
μκ² μ΅λλ€. READMEλ μ€ν΄μ μμ§κ° μμ΅λλ€. 쿼리 μ€νμ΄ μλ "λκΈ°" 쿼리 κ²°κ³Όλ§ μ·¨μν©λλ€.
MySQL νλ‘ν μ½μ 쿼리 μ€νμ μ·¨μνλ μμ ν λ°©λ²μ μ 곡νμ§ μμ΅λλ€.
μΌλΆ CLIλ μ·¨μλ₯Ό μ§μνμ§λ§ μΌλΆ νκ²½μμλ μμ νμ§ μκ±°λ μμ μ μ΄μ§ μμ΅λλ€.
κ°μ¬
λΉμ μ΄ν΄μΌ ν μΌμ νΈλμμ
μ μ¬μ©νλ κ²μ
λλ€. 컀λ°νμ§ μμΌλ©΄ λ‘€λ°±λ©λλ€.
λ°λΌμ νΈλμμ
μ΄ μμ ν λμ μκ°μ΄ μ΄κ³Όλ©λλ€.
@andizzle @alexclifford @edwardhutchison
μκ° μ΄κ³Ό νμ 첫 λ²μ§Έ storedProcκ° μ½μ λμ§λ§ λ λ²μ§Έ storedProcλ μ½μ λμ§ μλ μ΄μ λ 무μμ λκΉ? κ·νμ μ§μ μ λ°λΌ μ½μ λκ±°λ μ½μ λμ§ μλλ€κ³ κ°μ ν©λλ€. λλΌμ΄λ²κ° 쿼리 μ€ν μ·¨μλ₯Ό μ§μνμ§ μλ κ²½μ° μ€νμ μ·¨μνλ κ²μ²λΌ 보μ΄λ μ΄μ λ 무μμ λκΉ?
MySQL λμμ λλ€. λλ λ§μ΄ λͺ¨λ₯Έλ€. κ·Έλ¬λ SLEEP()μ μ°κ²°μ΄ λ«ν λ λ§€μ° μ΄μν λμμ ν©λλ€.
@julienschmidt μ΄ μμ΄λμ΄μ λν΄ μ΄λ»κ² μκ° νμΈμ ?
SHOW FULL PROCESSLIST
λ°KILL
KILL
λ₯Ό μ¬μ©νμ¬ μ¬λ°λ₯Έ 쿼리μ
λΆννλ κ·Έκ²μ λλΌμ΄λ² μμ€μμ μ½κ² ꡬνν μ μμ΅λλ€. λλΌμ΄λ²κ° μ΄λ¬ν λͺ λ Ήμ μ€ννλ λ λ²μ§Έ μ°κ²°μ΄ νμν©λλ€. μ΄λ 곡μ "κ΄λ¦¬ μ°κ²°"μ΄κ±°λ μμ² μ μ΄λ¦° μ°κ²°μΌ μ μμ΅λλ€.
μ°μ , μ΄κ²μ μ΄μ μλ₯Ό ν¨μ¬ λ 볡μ‘νκ² λ§λ€ κ²μ
λλ€. νμ¬ μΈμ
λ° μ°κ²°μ λͺ¨λ μ²λ¦¬λ λλΌμ΄λ²κ° μλ database/sql
ν¨ν€μ§μ μν΄ μνλλ©° μ μ°κ²° λ±μ μ¬λ κΈ°λ₯λ§ μ 곡ν©λλ€.
κ·Έλ¬λ ν¨μ¬ λ λ¬Έμ λ μ€μ λ‘ μ¬λ°λ₯Έ μλ²λ₯Ό μ°Ύμ μ μλ λ°©λ²μ΄ μλ€λ κ²μ
λλ€(λ¨ νλλ§ μλ κ²½μ°κ° μλλ©΄). λλΌμ΄λ²λ μ£Όλ‘ mysql λ‘λ λ°Έλ°μ± νλ‘μμ ν¨κ» λ°°ν¬λ©λλ€. μ΄ κ²½μ° SHOW FULL PROCESSLIST
κ° μλͺ»λ μλ²μμ μ€νλμ΄ μΏΌλ¦¬λ₯Ό μ°Ύμ μ μμ κ°λ₯μ±μ΄ λμ΅λλ€.
쿼리λ₯Ό μ§μ μΌλ‘ μ·¨μν μ μλλ‘ database/sql
μ νμν μ¬νμ μμ νλ Go 2 μ μμ ν μ μμ΅λκΉ?
λλ μμ§ν database/sql
λλ μ΄ λλΌμ΄λ²κ° μ¬κΈ°μμ λ¬Έμ κ° μλλΌ λ¨μν MySQL μ체λΌκ³ μκ° ν©λλ€ . νμ§ μμ΅λλ€ .
μ’μ μμμ μλ²λ‘ λ³΄λΈ μΏΌλ¦¬μ λν
λ¨μΌ μλ² μ€μ μ κ²½μ° Postgresμ μ μ¬ν λ°©μμΌλ‘ 쿼리 λ₯Ό KILL
λͺ
λ Ήμ 보λ
λλ€.
μΌλΆ νλ‘μμ κ²½μ°λ λ μ΄λ ΅μ΅λλ€. νμ¬ μ΄λ¬ν νλ‘μλ λλΌμ΄λ²μκ² μμ ν ν¬λͺ ν©λλ€. νμν κ²μ μ°κ²°μ΄ λ€λ₯Έ κΈ°μ‘΄ μ°κ²°κ³Ό λμΌν λ°±μλλ‘ μ΄λ¦¬λλ‘ λ³΄μ₯νλ μΌμ’ μ λ©μ»€λμ¦μ λλ€.
μ€μ λ‘ μ μ¬ν μ κ·Ό λ°©μ(λ¨μΌ μλ² μ€μ μ κ²½μ°)μ λν κ³΅κ° PRμ΄ μμ΅λλ€. https://github.com/go-sql-driver/mysql/pull/791
MySQLμ κΈ°λ₯ μμ²μ μ μΆν κ²μ λλ€. 쿼리μ νλ‘μΈμ€ IDλ₯Ό ν¬ν¨νλλ‘ μμ²νλ©΄ μ΄μ λ²μ κ³Ό νΈνλμ§ μλ λ³κ²½ μ¬νμ΄ μμ±λμ΄ κ±°λΆν μ μμ΅λκΉ?
μ·¨μμ λ¬Έμ λ μ΄λΏλ§μ΄ μλλλ€. λͺ κ°μ§ λ€λ₯Έ λ¬Έμ κ° μμ΅λλ€.
μ§κ΅¬μμλ "μ격μμ μ λ’°ν μ μλ μ·¨μ" νλ‘ν μ½μ΄ μμ΅λλ€.
μΌλΆ CPUλ₯Ό μ μ½ν λλ§ μ¬μ©ν΄μΌ ν©λλ€.
μ΄μ¨λ , μ΄ λ¬Έμ μ μμ μ 무μμ
λκΉ?
μ·¨μλ₯Ό ꡬννλ©΄ μ΄μν λμμ νΌν μ μμ΅λλ€.
"컨ν
μ€νΈμ μν΄ μ·¨μλ¨" μΏΌλ¦¬κ° MySQL μλ²μμ μ€νλκ±°λ μ·¨μλμλμ§ μ μ μμ΅λλ€. νμ΄λ° λ¬Έμ μ
λλ€.
λΉμ λ§μ΄ ν μ μλ κ²μ νΈλμμ
μ μ¬μ©νλ κ²μ
λλ€. λͺ¨λ μΏΌλ¦¬κ° λ‘€λ°±λ©λλ€.
"쿼리 μ·¨μ ꡬν"μ λν λ¬Έμ κ° μ λ§λ‘ νμν κ²½μ° μ λ¬Έμ λ₯Ό μ μΆνκ³ λ«μ΅λλ€.
λ΄ μ루μ μ λ€μκ³Ό κ°μ΅λλ€. https://medium.com/@rocketlaunchr.cloud/canceling -mysql-in-go-827ed8f83b30
κ°μ₯ μ μ©ν λκΈ
λΆννλ κ·Έκ²μ λλΌμ΄λ² μμ€μμ μ½κ² ꡬνν μ μμ΅λλ€. λλΌμ΄λ²κ° μ΄λ¬ν λͺ λ Ήμ μ€ννλ λ λ²μ§Έ μ°κ²°μ΄ νμν©λλ€. μ΄λ 곡μ "κ΄λ¦¬ μ°κ²°"μ΄κ±°λ μμ² μ μ΄λ¦° μ°κ²°μΌ μ μμ΅λλ€.
μ°μ , μ΄κ²μ μ΄μ μλ₯Ό ν¨μ¬ λ 볡μ‘νκ² λ§λ€ κ²μ λλ€. νμ¬ μΈμ λ° μ°κ²°μ λͺ¨λ μ²λ¦¬λ λλΌμ΄λ²κ° μλ
database/sql
ν¨ν€μ§μ μν΄ μνλλ©° μ μ°κ²° λ±μ μ¬λ κΈ°λ₯λ§ μ 곡ν©λλ€.κ·Έλ¬λ ν¨μ¬ λ λ¬Έμ λ μ€μ λ‘ μ¬λ°λ₯Έ μλ²λ₯Ό μ°Ύμ μ μλ λ°©λ²μ΄ μλ€λ κ²μ λλ€(λ¨ νλλ§ μλ κ²½μ°κ° μλλ©΄). λλΌμ΄λ²λ μ£Όλ‘ mysql λ‘λ λ°Έλ°μ± νλ‘μμ ν¨κ» λ°°ν¬λ©λλ€. μ΄ κ²½μ°
SHOW FULL PROCESSLIST
κ° μλͺ»λ μλ²μμ μ€νλμ΄ μΏΌλ¦¬λ₯Ό μ°Ύμ μ μμ κ°λ₯μ±μ΄ λμ΅λλ€.