как createConnection работает с NodeJS в mysql?

#node.js #node-modules #node-mysql

#node.js #узлы-модули #узел-mysql

Вопрос:

Что делает createConnection?

 var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'bob',
  password : 'secret'
});
  

Я пишу приложение в NodeJS с использованием модуля mysql. Например, у меня есть несколько собственных модулей authentication , которым определенно требуется подключение к БД. Вопрос: если у меня есть несколько модулей, в которых я использую этот метод для создания соединения, будет ли он создавать новое соединение для меня каждый раз или использовать первое? Если создает, то создает при первой загрузке моего собственного модуля или каждый раз? О, и если он создает, когда он будет уничтожен?

Вот как у меня это есть в моем authentication модуле:

 var config = require('./config.js');
var mysql = require('mysql');
var connection = mysql.createConnection(config.connectionString);

exports.login = function() ...
  

У меня есть некоторые базовые упущения в понимании того, как работают модули и собственные модули.

Спасибо за ответы.

Ответ №1:

Вы можете создать пул подключений в одном модуле, а затем совместно использовать этот пул для всех ваших модулей, вызывая pool.getConnection() всякий раз, когда вам нужно. Это может быть лучше, чем постоянно поддерживать одно общее соединение открытым.

Один проект, над которым я работаю, делает это:

utils/database.js

 var mysql = require('mysql');

var pool = mysql.createPool({
    connectionLimit: 100,
    host: 'localhost',
    user: 'xxxxx',
    password: 'yyyyy',
    database: 'zzzzz',
    debug: false
});

module.exports = pool
  

accounts.js

 var express = require('express');
var router = express.Router();

var pool = require('./utils/database');

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

    pool.getConnection(function(err, connection) {

        // do whatever you want with your connection here

        connection.release();

    });
});

module.exports = router;
  

Другой способ, с которым я играю, выглядит так:

utils/database.js

 var mysql = require('mysql');

var pool = mysql.createPool({
    connectionLimit: 100,
    host: 'localhost',
    user: 'xxxxx',
    password: 'yyyyy',
    database: 'zzzzz',
    debug: false
});

var getConnection = function(callback) {
    pool.getConnection(function(err, connection) {
        callback(err, connection);
    });
});

module.exports = getConnection;
  

accounts.js

 var express = require('express');
var router = express.Router();

var createConnection = require('./utils/database');

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

    createConnection(function(err, connection) {

        // do whatever you want with your connection here

        connection.release();

    });
});

module.exports = router;
  

Комментарии:

1. Ограничение подключения 100 означает 100 одновременных подключений ? Спасибо

2. В первом примере я не думаю, что pool.createConnection() это правильный метод.

3. Правильно. Это должно было быть pool.getConnection

Ответ №2:

Он будет создавать новое соединение каждый раз, когда вы вызываете connection.connect() . Соединение разрушается либо при завершении программы, либо при вызове connection.end(). Если вы хотите повторно использовать соединение, вы можете поместить логику соединения в отдельный модуль, а затем просто экспортировать само соединение, вот так.

В файле под названием connection.js

 var mysql = require("mysql");
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'user',
  password : 'password'
});
connection.connect();
module.exports = connection;
  

А затем в любом клиентском файле:

 var connection = require("./connection.js");
connection.query('some query', callback);
  

Каждый файл требует connection.js будет повторно использовать существующее соединение.

Комментарии:

1. итак, если я помещу само соединение в отдельный модуль, всякий раз, когда я использую connection (даже в разных модулях, требуя его), он не создаст другой его экземпляр, так что будет только один?

2. да, правильно. Вы можете убедиться в этом самостоятельно, войдя в оболочку mysql и запустив SHOW STATUS WHERE variable_name = "Threads_connected";