在Node.js中管理数据库连接的最佳实践是什么?

16

我正在构建一个Node应用程序,它将查询简单和更复杂的(多个连接)查询。我正在寻求有关如何管理MySQL连接的建议。

我有以下元素:

  • server.js: Express
  • router1.js(虚构名称):Express路由器中间件
  • router2.js(虚构名称):Express路由器中间件
    //这是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){
...
});
之外?


5
我认为最好的方法不是保持开放连接,而是使用连接池,这样可以重复使用连接。 这里是如何汇集连接的链接,链接:https://www.npmjs.com/package/mysql#pooling-connections。这篇好文章提供了更多信息,链接:https://dzone.com/articles/close-your-database-connections。 - kimobrian254
3
当第一次打开连接时,会基于连接字符串创建一个连接池。当我们关闭连接后,该连接将返回到池中。如果我们使用相同的连接字符串打开另一个连接,连接池会查看是否有可用的连接。如果有,则返回该连接给调用方,而不是打开一个新的连接。建议使用 using 块关闭或打开连接。这样,连接将被返回到池中以供未来重复使用。 - kimobrian254
4个回答

9

我在使用mysql2,它基本上就是带有promise的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;

如果你要在控制器和router.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;

您可以选择使用Promise或不使用,这并不重要。 当查询完成时,池与您的连接会自动释放。 然后,您应该从路由器或应用程序中调用getAll。

希望这有所帮助,如果没有,很抱歉。


3

连接池是正确的做法。为每个请求打开新的连接会减慢应用程序的速度,并且它可能最终成为瓶颈,因为 Node.js 不像 PHP 一样自动关闭连接。因此,连接池确保始终有固定数量的连接可用,并在需要时处理不必要的连接的关闭。

这是我使用 Sequelize 启动我的 express 应用程序的方式。对于 Mongoose,它更或多或少相似,除了库 API 不同。

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

只有在建立了数据库连接之后,应用程序才会启动。这确保了服务器不会在没有建立数据库连接的情况下处于活动状态。连接池默认情况下会保持连接打开,并从连接池中选择一个连接来执行所有查询。


0
如果您使用createPoolmysql将管理打开和关闭连接,并且性能更好。无论您使用mysql、mysql2还是sequlize,都要使用一个单独的文件来进行createPool并导出它。您可以在任何地方使用它。不要使用类,只需在nodejs中以函数方式执行即可获得更好的性能。

-6
> npm install mysql

MySQL是一个非常棒的模块,使得与MySQL工作变得非常简单,并提供您可能需要的所有功能。

一旦您安装了MySQL,连接到您的数据库所需做的就是

var mysql = require('mysql')

var conn = mysql.createConnection({
  host: 'localhost',
  user: 'username',
  password: 'password',
  database: 'database'
})

conn.connect(function(err) {
  if (err) throw err
  console.log('connected')
})

现在你已经准备好开始编写和读取数据库了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接