连接到MySQL的正确方法是什么?

时间:2018-08-20 06:51:02

标签: mysql node.js

我什么时候连接mysql感到困惑。 程序启动时应该连接mysql吗?

var mysql      = require('mysql');
var connection = mysql.createConnection(...);
router.get('/', (ctx, next) => {
     connection.query('SELECT 1', function (error, results, fields) {
     if (error) throw error;
     // connected!
     });
});

或类似的

var mysql      = require('mysql');
router.get('/', (ctx, next) => {
         var connection = mysql.createConnection(...);
         connection.query('SELECT 1', function (error, results, fields) {
         if (error) throw error;
         // connected!
         });
    });

1 个答案:

答案 0 :(得分:0)

程序启动时,请勿连接它。一方面,如果连接超时,您的程序将失败,并且您要为客户端的每个连接使用单独的数据库连接。

因此,如果您必须在提供的两种解决方案之间做出选择,则应采用第二种解决方案。但是您应该使用connection.end();

关闭连接

或者,您可以使用连接池:

var mysql      = require('mysql');
var connection = mysql.createPool(...);

router.get('/', (ctx, next) => {
  connection.query('SELECT 1', function (error, results, fields) {
  if (error) throw error;
    // connected!
  });
});

如果要为所有路由共享一个数据库连接,则可以添加一个中间件,如下所示:

router.use(async (ctx, next) => {
  await new Promise((reject, resolve) => {
    pool.getConnection((err, connection) => {
      if (err) {
        reject(err)
      } else {
        ctx.dbConnection = connection
        resolve()
      }
    })
  })
  await next()
  ctx.dbConnection.release()
})

router.get('/', (ctx, next) => {
  connection.query('SELECT 1', function (error, results, fields) {
     if (error) throw error;
     // connected!
  });
});

我建议切换到基于Promise的mysql版本。