【问题标题】:Should i close mysql connection in websocket我应该在 websocket 中关闭 mysql 连接吗
【发布时间】:2020-09-03 21:45:25
【问题描述】:

简而言之,我正在使用 socket.io 创建一个聊天服务,我想知道我是否应该关闭 mysql 连接,然后在我必须使用它时重新打开它。此聊天服务每秒可能会收到 10-20 个事件。

我正在套接字外部创建连接:

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'dbname',
})

并且仅用于在触发套接字事件时运行查询

socket.on('check_token', (token) => {
    // token is verified safely, not passing it as it is.
    connection.query("SELECT * FROM tokens WHERE token = '" + token + "'", (error, results, fields) => {...})
})

但是,我应该在完成释放 mysql 的工作后关闭连接吗?
或者,关闭连接并重新连接是否会使情况变得更糟,因为它总是会在触发事件时重新连接。
或者..有没有更好的方法我不知道?

【问题讨论】:

  • 您应该始终关闭并重新打开 JDBC 连接,并使用底层连接池。
  • 问题与 JDBC 无关
  • “企业”解决方案是使用“连接池”,它是连接的集合,其中许多保持打开状态。这提供了一些额外的冗余,以防其中一个连接意外关闭,并允许同时查询。对于使用率低到中等的应用程序来说,这太过分了,只需打开数据库连接并重用它就足够了。企业规模的另一种方法是负载平衡多个应用程序而不是使用连接池,因此在这种情况下使用保持打开的单个连接也是可行的。
  • @Codebling 谢谢,当时我不知道连接池。随着 Antek 的回答,我已经用连接池替换了我的连接

标签: mysql socket.io


【解决方案1】:

建立与数据库的连接需要很长时间。 作业完成后,您不应断开与 db 的连接。 应用服务器应该使用连接池。 当您的服务器启动时启动您的池,例如 10 个并发连接。 池大小(连接数量)取决于您的系统负载。有时您需要 2 个并发连接,有时需要 100 个。 当你想从db中获取数据时,只需从pool中获取连接,不需要时返回即可。

【讨论】:

    【解决方案2】:

    您肯定希望保持单个连接或一组持久数据库连接处于打开状态。否则,每个请求都建立连接的开销会给您带来很多整体应用程序延迟。

    保持连接打开仍然需要跟踪它们,以便在连接失效、对等点断开等情况下尽早释放资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-02
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 2012-12-29
      • 2011-06-07
      相关资源
      最近更新 更多