返回顶部
首页 > 资讯 > 精选 >数据库连接在第一个请求后关闭
  • 547
分享到

数据库连接在第一个请求后关闭

2024-02-06 11:02:02 547人浏览 安东尼
摘要

问题内容 我在golang上写api,遇到了错误。在一个请求服务器返回错误后,sql 数据库已关闭。我想通过上下文传输数据库连接。 main.Go func main() {

问题内容

我在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)
    }
}

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)
}

注册.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!")
}

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

要求:

{
  "email": "[email protected]",
  "password": "123123123"
}

第一反应:

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

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

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


正确答案


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

不要。这不仅是不好的做法,而且实际上是 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))

以上就是数据库连接在第一个请求后关闭的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 数据库连接在第一个请求后关闭

本文链接: https://lsjlt.com/news/561458.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 数据库连接在第一个请求后关闭
    问题内容 我在golang上写api,遇到了错误。在一个请求服务器返回错误后,sql 数据库已关闭。我想通过上下文传输数据库连接。 main.go func main() { ...
    99+
    2024-02-06
  • 如何在PHP中关闭数据库连接
    PHP是一种流行的服务器端脚本语言,它被广泛应用于Web开发。在与数据库交互时,我们需要打开数据库连接,但在不需要数据库连接时,我们需要关闭它。在本文中,我们将讨论如何在PHP中关闭数据库连接。PHP与MySQL数据库交互在PHP中,我们可...
    99+
    2023-05-14
  • 怎么在PHP中关闭数据库连接
    这篇文章主要讲解了“怎么在PHP中关闭数据库连接”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在PHP中关闭数据库连接”吧!PHP与MySQL数据库交互在PHP中,我们可以使用许多不同的...
    99+
    2023-07-05
  • 在Python数据库连接池中如何创建请求连接
    在Python数据库连接池中如何创建请求连接,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在Python数据库连接池中操作过程中如果你设置好了连接池,你就可以按...
    99+
    2023-06-17
  • 通道未在第一个 API 请求上发送数据
    问题内容 我有一个 SSE 端点,它将数据发送到前端,并且该数据是从另一个 API 端点检索的。我对 go 中的 channels 仍然很陌生,似乎我必须触发 API 端点两次,以便 ...
    99+
    2024-02-05
  • mongodb怎么关闭数据库连接
    在MongoDB中关闭数据库连接有两种方法。方法一:使用`db.logout()`命令来关闭连接。这会注销当前用户并关闭连接。```...
    99+
    2023-09-06
    mongodb 数据库
  • sqlserver怎么关闭数据库连接
    在 SQL Server 中,可以使用以下两种方法关闭数据库连接: 使用 Transact-SQL 语句:可以使用 KILL 命令...
    99+
    2024-04-09
    sqlserver 数据库
  • 第一个请求不在 goroutine 函数的开头发送
    哈喽!今天心血来潮给大家带来了《第一个请求不在 goroutine 函数的开头发送》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang...
    99+
    2024-04-04
  • 怎么使用PHP关闭数据库连接
    这篇文章主要介绍了怎么使用PHP关闭数据库连接的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用PHP关闭数据库连接文章都会有所收获,下面我们一起来看看吧。1.为什么要关闭数据库连接?在PHP中,连接到数据...
    99+
    2023-07-05
  • PHP怎么建立和关闭数据库连接
    本篇内容主要讲解“PHP怎么建立和关闭数据库连接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP怎么建立和关闭数据库连接”吧!PHP建立和关闭数据库连接之mysql_connect()res...
    99+
    2023-06-17
  • 减少与数据库的连接,提高请求效率
    工时系统代码优化记录:在查看工时详情的时候,我们需要将个人的工时分项目,每月进行一个展示。一年有12个月,一个人有多个项目。初始代码只是为了实现功能,所以在代码中进行的循环操作,即每个项目每月到数据库中获取...
    99+
    2024-04-02
  • oracle怎么连接另一个数据库
    要连接另一个数据库,可以使用Oracle的Database Link功能。Database Link是一种数据库对象,它允许在一个O...
    99+
    2024-03-14
    oracle 数据库
  • Oracle数据库url连接最后一个orcl代表的是什么
    这篇文章主要介绍Oracle数据库url连接最后一个orcl代表的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在生产上项目启动访问 一个数据库的时候,出现了ORA-12505...
    99+
    2024-04-02
  • mysql数据库无连接自动关闭怎么解决
    本篇内容主要讲解“mysql数据库无连接自动关闭怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql数据库无连接自动关闭怎么解决”吧!windows...
    99+
    2022-11-30
    mysql
  • 12c上创建第二个数据库实例后无法启动第一个实例
    在Windows 10上安装了12.2.0.1,第一个实例orcl是以非空器数据库安装的,可正常使用后,关闭实例。 创建第二个数据库实例zlcdb,创建的是容器数据库,可以正常使用后,关闭实例。 再次启动第...
    99+
    2024-04-02
  • 如何在Java项目中模拟一个数据库连接池
    本文章向大家介绍如何在Java项目中模拟一个数据库连接池,主要包括如何在Java项目中模拟一个数据库连接池的使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪...
    99+
    2023-06-06
  • springbootdruid数据库连接池连接失败后一直重连的解决方法
    目录druid 重连原因errorCount 错误次数总结在使用个人阿里云测试机,在查询实时输出日志时,看到数据库连接失败后,服务器一直在重连服务器。开始以为是遭受重复攻击,后面把服...
    99+
    2024-04-02
  • springboot druid数据库连接池连接失败后一直重连怎么解决
    这篇文章主要介绍了springboot druid数据库连接池连接失败后一直重连怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot druid数据库连接池连接失败后一...
    99+
    2023-06-30
  • navicat数据库连接保存在哪个文件
    navicat 保存数据库连接信息的文件是 .ncc 文件,该文件存储连接详细信息,如数据库类型、服务器地址、端口、用户名和密码。 Navicat 数据库连接信息保存在哪个文件 Nav...
    99+
    2024-04-23
    mysql git navicat
  • 阿里云如何与数据库连接在一起一个全面的指南
    在当今数字化的世界中,数据库是企业运行的核心。然而,如何有效地将数据库与云服务连接在一起,以便更好地管理和分析数据,是一个重要的问题。本文将详细介绍阿里云如何与数据库连接在一起,包括各种工具和技术,以帮助您实现这一目标。 一、阿里云与数据库...
    99+
    2023-11-18
    阿里 数据库连接 指南
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作