Table of Contents
正确答案
Home Backend Development Golang Database connection closed after first request

Database connection closed after first request

Feb 06, 2024 am 10:57 AM

Database connection closed after first request

问题内容

我在golang上写api,遇到了错误。在一个请求服务器返回错误后,sql 数据库已关闭。我想通过上下文传输数据库连接。

main.go

func main() {
    app := fiber.new()

    db, err := sqlx.connect("pgx", os.getenv("postgresql_url"))

    if err != nil {
        panic(err)
    }

    if err = db.ping(); err != nil {
        panic(err)
    }

    db.setmaxopenconns(10)
    db.setmaxidleconns(5)
    db.setconnmaxlifetime(5 * time.minute)
    db.setconnmaxidletime(5 * time.minute)

    defer db.close()

    configure_router.configurerouter(app, db)

    if err = app.listen(os.getenv("port")); err != nil {
        log.fatalln(err)
    }
}
Copy after login

configure_router.go

func configurerouter(app *fiber.app, db *sqlx.db) {
    //middlewares
    app.use(logger.new(logger.config{
        format: "[${ip}]:${port} ${time} ${status} - ${method} ${path}\n",
    }))

    app.use(cors.new(cors.config{
        //alloworigins: "http://localhost:3000",
        allowheaders: "origin, content-type, accept",
    }))

    app.use("/api", func(ctx *fiber.ctx) error {
        ctx.context().setuservalue("dbconn", db)
        return ctx.next()
    })

    //authentication endpoints
    app.post("api/register", register.register)
    app.post("api/auth/login", login.login)
}
Copy after login

注册.go

func register(ctx *fiber.ctx) error {
    conn := ctx.context().uservalue("dbconn").(*sqlx.db)

    var in in

    if err := ctx.bodyparser(&in); err != nil {
        return make_response.makeinforesponse(ctx, fiber.statusunprocessableentity, 1, err.error())
    }

    if in.email == "" || in.password == "" {
        return make_response.makeinforesponse(ctx, fiber.statusbadrequest, 1, "incorrect data input")
    }

    elementexist := false
    err := conn.get(&elementexist, "select exists(select email from users where email = $1)", in.email)

    // here programm fall in second request
    if err != nil {
        return make_response.makeinforesponse(ctx,fiber.statusinternalservererror, 1, err.error())
    }


    if elementexist {
        return make_response.makeinforesponse(ctx, fiber.statusbadrequest, 1, "user already registered!")
    }

    passwordhash, err := hash_passwords.hashpassword(in.password)
    if err != nil {
        return err
    }

    _, err = conn.exec("insert into users (email, password_hash) values ($1, $2)", in.email, passwordhash)

    if err != nil {
        return make_response.makeinforesponse(ctx, fiber.statusinternalservererror, 1, err.error())
    }

    return make_response.makeinforesponse(ctx, fiber.statusok, 0, "registration was successful!")
}
Copy after login

如果我在 /api/register 中发送请求并且用户已经在第一个请求中注册,我会得到

要求:

{
  "email": "[email protected]",
  "password": "123123123"
}
Copy after login

第一反应:

{
   "error_code": 0,
   "message": "user already registered!"
}
Copy after login

但是如果我想发送另一个请求,我会得到:

{
   "error_code": 1,
   "message": "sql: database is closed",
}
Copy after login


正确答案


我想通过上下文传输数据库连接。

不要。这不仅是不好的做法,而且实际上是 fasthttp.requestctx 本身在每次请求后关闭数据库。上下文应仅包含请求特定值。全局数据库连接几乎不是特定于请求的。

请参阅 setuservalue 的文档,特别是最后一个段落:

从顶层requesthandler返回后,所有值都会从ctx中删除。此外,在从 ctx 中删除值之前,会在每个实现 io.closer 的值上调用 close 方法。

一个快速修复方法是在闭包中捕获数据库:

func Register(db *sqlx.DB) (fn func(*fiber.Ctx) error) {
    return func(ctx *fiber.Ctx) error {
        // ...
        elementExist := false
        err := db.Get(&elementExist, "select exists(select email from users where email = $1)", in.Email)
        // ...
    }
}

// ...

// delete this or comment it out
// app.Use("/api", func(ctx *fiber.Ctx) error {
//    ctx.Context().SetUserValue("dbConn", db)
//    return ctx.Next()
// })

app.Post("api/register", register.Register(db))
Copy after login

The above is the detailed content of Database connection closed after first request. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1670
14
PHP Tutorial
1274
29
C# Tutorial
1256
24
Golang vs. Python: Performance and Scalability Golang vs. Python: Performance and Scalability Apr 19, 2025 am 12:18 AM

Golang is better than Python in terms of performance and scalability. 1) Golang's compilation-type characteristics and efficient concurrency model make it perform well in high concurrency scenarios. 2) Python, as an interpreted language, executes slowly, but can optimize performance through tools such as Cython.

Golang and C  : Concurrency vs. Raw Speed Golang and C : Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golang is better than C in concurrency, while C is better than Golang in raw speed. 1) Golang achieves efficient concurrency through goroutine and channel, which is suitable for handling a large number of concurrent tasks. 2)C Through compiler optimization and standard library, it provides high performance close to hardware, suitable for applications that require extreme optimization.

Getting Started with Go: A Beginner's Guide Getting Started with Go: A Beginner's Guide Apr 26, 2025 am 12:21 AM

Goisidealforbeginnersandsuitableforcloudandnetworkservicesduetoitssimplicity,efficiency,andconcurrencyfeatures.1)InstallGofromtheofficialwebsiteandverifywith'goversion'.2)Createandrunyourfirstprogramwith'gorunhello.go'.3)Exploreconcurrencyusinggorout

Golang vs. C  : Performance and Speed Comparison Golang vs. C : Performance and Speed Comparison Apr 21, 2025 am 12:13 AM

Golang is suitable for rapid development and concurrent scenarios, and C is suitable for scenarios where extreme performance and low-level control are required. 1) Golang improves performance through garbage collection and concurrency mechanisms, and is suitable for high-concurrency Web service development. 2) C achieves the ultimate performance through manual memory management and compiler optimization, and is suitable for embedded system development.

Golang's Impact: Speed, Efficiency, and Simplicity Golang's Impact: Speed, Efficiency, and Simplicity Apr 14, 2025 am 12:11 AM

Goimpactsdevelopmentpositivelythroughspeed,efficiency,andsimplicity.1)Speed:Gocompilesquicklyandrunsefficiently,idealforlargeprojects.2)Efficiency:Itscomprehensivestandardlibraryreducesexternaldependencies,enhancingdevelopmentefficiency.3)Simplicity:

Golang vs. Python: Key Differences and Similarities Golang vs. Python: Key Differences and Similarities Apr 17, 2025 am 12:15 AM

Golang and Python each have their own advantages: Golang is suitable for high performance and concurrent programming, while Python is suitable for data science and web development. Golang is known for its concurrency model and efficient performance, while Python is known for its concise syntax and rich library ecosystem.

Golang and C  : The Trade-offs in Performance Golang and C : The Trade-offs in Performance Apr 17, 2025 am 12:18 AM

The performance differences between Golang and C are mainly reflected in memory management, compilation optimization and runtime efficiency. 1) Golang's garbage collection mechanism is convenient but may affect performance, 2) C's manual memory management and compiler optimization are more efficient in recursive computing.

The Performance Race: Golang vs. C The Performance Race: Golang vs. C Apr 16, 2025 am 12:07 AM

Golang and C each have their own advantages in performance competitions: 1) Golang is suitable for high concurrency and rapid development, and 2) C provides higher performance and fine-grained control. The selection should be based on project requirements and team technology stack.

See all articles