当前位置: 首页 > 知识库问答 >
问题:

在node.js中管理数据库连接,最佳实践?

傅自明
2023-03-14

我正在构建一个节点应用程序,它将查询简单的和更复杂的(多连接)查询。我正在寻找关于我应该如何管理mySQL连接的建议。

我有以下几个要素:

  • server.js:express
  • Router1.js(虚构名称):快速路由器中间件
  • Router2.js(虚构名称):快速路由器中间件

    //this is router1

    router.get('/', function (req, res){

    connection.connect(function(Err){...});

      connection.query('SELECT* FROM table WHERE id = "blah"', function(err,results,fields){
        console.log(results);
      });
      ...
    connection.end();
    })

我是否应该在每次请求“/router1/”时都连接到mysql,就像本例中那样,还是最好在启动时保持一个连接打开?作为:

connection.connect();
router.get('/',function(req,res){
...
});

null

共有2个答案

麹承
2023-03-14

连接池应该是这样做的。为每个请求打开一个新连接会减慢应用程序的速度,而且迟早会成为瓶颈,因为node不会像PHP那样自动关闭连接。因此,连接池确保固定数量的连接总是可用的,并且在需要时处理不必要的连接的关闭。

这就是我使用后遗症启动我的express应用程序的方式。对于Mongoose来说,除了库API之外,它或多或少是simlar的。

const sequelize = new Sequelize('database', 'username', 'password', {
    host: 'localhost',
    dialect: 'mysql',
    pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
    }
});

sequelize.authenticate()
    .then(
        // On successfull connection, open a port
        // and listen to requests. This is where the application 
        // starts listening to requests.
        () => {
            const server = http.createServer(app);
            server.listen(port);
        },
    )
    .catch(err => {
        console.error('Unable to connect to the database:', err);
        console.error('Cancelling app server launch');
    });

只有在建立了数据库连接后,才会启动应用程序。这可以确保服务器在没有任何数据库连接的情况下不会处于活动状态。默认情况下,连接池将保持连接打开,并为所有查询使用池外的连接。

劳烨
2023-03-14

我使用mysql2,它基本是mysql,但有承诺。如果您使用mysql,您也可以这样做。

创建一个名为connection.js的独立文件。

const mysql = require('mysql2');

const connection = mysql.createPool({
    host: "localhost",
    user: "",
    password: "",
    database: ""
    // here you can set connection limits and so on
});

module.exports = connection;

那么您最好创建一些模型,并在路由器中从控制器中调用这些模型。get('/',(req,res)=>{here});

模型应该是这样的:

const connection = require('../util/connection');

async function getAll() {
    const sql = "SELECT * FROM tableName";
    const [rows] = await connection.promise().query(sql);
    return rows;
} 
exports.getAll = getAll;

无论有没有承诺,你都可以做到这一点,这都无关紧要。查询完成后,您与池的连接将自动释放。然后您应该从您的路由器或应用程序调用getAll。

我希望这有帮助,如果没有,对不起。

 类似资料:
  • 问题内容: 我有一个用Go编写的Web服务,目前我将这个Global包导入到任何地方,其中包含与MongoDB的连接(通过MGO),但是我不得不说这对我来说非常讨厌。在Go中维护与数据源的连接的最佳实践是什么?我来自PHP世界,因此来自Global:S 问题答案: 导入一个将初始化对象导出为包级别变量或通过访问器/初始化程序导出的包没有错。后者也许对古典“ OOP主义者”更具吸引力。

  • 问题内容: 在Java Servlet中管理数据库连接的最佳方法是什么? 当前,我只是在函数中打开一个连接,然后在中将其关闭。 但是,我担心“永久地”保持数据库连接可能是一件坏事。 这是处理此问题的正确方法吗?如果没有,有什么更好的选择? 编辑:给出更多的说明:我尝试为每个请求简单地打开/关闭一个新连接,但是通过测试,由于创建了太多的连接,我看到了性能问题。 通过多个请求共享连接是否有任何价值?此

  • 问题内容: 好的,这是那些自以为是的主题之一,但是根据您的知识,见解和当前实践,设置以下方案的最佳方法是什么? 我正在构建一个广泛的数据输入应用程序,而从广义上来说,我的意思是我只有基本设置,它包含了整个程序的约15%至25%,并且我大约有15个表单是部分设置的。(他们仍然需要工作)我使用SQL Compact 4.0作为后端数据库,因为我没有存储MMO的大量数据,所以我实际上并不需要更扩展的数据

  • 问题内容: 我正在使用Mongoose来管理Mongo数据库。我的连接文件非常简单: 然后在我的app.js中 并且“猫鼬”变量在全球范围内可用。我不想使用全局变量(至少不直接使用)。是否有更好的方法通过单例模式或其他方法在节点之间共享数据库连接变量(我正在使用express.js)? 问题答案: 我只是在app.js文件中执行以下操作: 此时,任何需要访问该模型的文件都可以执行以下操作: 最后,

  • 问题内容: 管理数据库更改的最佳方法是什么?无论数据库客户端的语言如何,我都需要一个解决方案。我还希望能够在那些更改中使用特定的数据库功能,例如存储过程,触发器等。 问题答案: 首先,请确保您已编写了完整的数据库构建脚本,以便可以根据需要重建数据库。 然后,应将每个更改写为更新脚本。这样,您可以针对数据库分别运行每个更改。 将更改提交到代码库后,将更改脚本与构建过程合并,使其自动发生…然后将更改脚

  • 问题内容: 我想在学习Guice的同时创建一个示例项目,该项目使用JDBC读取/写入SQL数据库。但是,在使用Spring多年之后,让它抽象化了连接处理和事务,我正在努力从概念上进行工作。 我想要一个可以启动和停止事务并调用大量存储库的服务,这些存储库可以重用相同的连接并参与相同的事务。我的问题是: 在哪里创建数据源? 如何授予存储库访问连接的权限?(ThreadLocal?) 管理事务的最佳方法