亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在連接關閉時終止正在運行的查詢

如何在連接關閉時終止正在運行的查詢

Go
慕標5832272 2022-08-01 19:09:11
我們在后端使用 https://github.com/go-gorm/gorm/ ORM和腳本來連接到我們的PostgreSQL數據庫。有時,當腳本正在編寫過程中時,我們通過按本地或殺死生產中的 pod /進程來手動終止作業。我們在所有腳本中都有一個,我還添加了處理SIGINT / SIGTERM信號以在kill上執行。Ctrl + Cdefer DB.Close()DB.Close()問題是,即使在關閉連接后,任何已經運行的現有查詢也不會被終止并繼續消耗數據庫資源。有沒有辦法在直接從gorm退出或通過其他黑客退出之前殺死由此連接池啟動的任何查詢。想到使用 和 終止查詢 使用 ,但是我們在運行新查詢時獲得的 pid 將與正在運行的查詢不同。pg_backend_pid()pg_stat_activitypg_backend_pid()版本:jinzhu/gorm v1.9.2
查看完整描述

1 回答

?
慕后森

TA貢獻1802條經驗 獲得超5個贊

您可以使用 將上下文作為參數。BeginTx(ctx context.Context, opts *sql.TxOptions)


這里有一個小例子:



import (

    "context"

    "fmt"

    "os"

    "os/signal"


    "github.com/jinzhu/gorm"

    _ "github.com/jinzhu/gorm/dialects/postgres"

)


func main() {

    db, err := gorm.Open("postgres", "host=localhost port=5432 user=gorm dbname=gorm password=mypassword sslmode=disable")

    if err != nil {

        panic(err)

    }

    defer db.Close()

    ctx := context.Background()


    ctx, cancel := context.WithCancel(ctx)

    c := make(chan os.Signal, 1)

    signal.Notify(c, os.Interrupt)

    defer func() {

        signal.Stop(c)

        cancel()

    }()

    go func() {

        select {

        case <-c:

            cancel()

        case <-ctx.Done():

        }

    }()


    transaction, err := db.DB().BeginTx(ctx, nil)

    _, err = transaction.Exec("SELECT pg_sleep(100)")

    if err != nil {

        fmt.Println(err.Error())

    }

}


查看完整回答
反對 回復 2022-08-01
  • 1 回答
  • 0 關注
  • 97 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號