NodeJS и MySQL, pool connetctions

12
Sanu0074
На сайте с 31.08.2012
Offline
110
2266

Есть express, установлен модуль mysql, цель: соединиться с базой где-то в каком-то месте один раз, и не делать в разных скриптах, в т.ч. и скриптах других моих модулей подобное:

var mysql = require('mysql');


var connection = mysql.createConnection({
host : 'localhost',
user : 'user',
password : '1111',
database : 'test'
});

connection.connect(function(err){
if(!err) {
console.log("Database is connected ");
} else {
console.log("Error connecting database ");
}
});

При этом, нужно ли мне использовать pool запросов? Если да, то как правильно к этому подойти? Весь смысл в том, чтобы понять как данное соединение сделать глобальным чтобы его повсеместно использовать, и так чтобы это не вызвало нагрузки на систему и со временем не повесило мускул. p.s. мои знания того как это работает в node.js - сыры пока что, очень надеюсь на детальное изъяснение решения по данной задаче.

Оптимизайка
На сайте с 11.03.2012
Offline
396
#1

Если этот модуль, то он умеет

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
Sanu0074
На сайте с 31.08.2012
Offline
110
#2

Оптимизайка, так, а как poll сделать глобальным чтоб нигде не использовать:

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

Или без этого никак?

p.s. и при установке этого модуля вот что я получил:

C:\Users\sanu0074\WebstormProjects\test>npm install felixge/node-mysql
npm WARN addRemoteGit Error: not found: git
npm WARN addRemoteGit at F (C:\Program Files\nodejs\node_modules\npm\node_mo
dules\which\which.js:72:28)
npm WARN addRemoteGit at E (C:\Program Files\nodejs\node_modules\npm\node_mo
dules\which\which.js:75:29)
npm WARN addRemoteGit at C:\Program Files\nodejs\node_modules\npm\node_modul
es\which\which.js:83:16
npm WARN addRemoteGit at FSReqWrap.oncomplete (fs.js:95:15)
npm WARN addRemoteGit felixge/node-mysql resetting remote C:\Users\sanu0074\App
Data\Roaming\npm-cache\_git-remotes\git-github-com-felixge-node-mysql-git-808786
65 because of error: { [Error: not found: git] code: 'ENOGIT' }
npm ERR! git clone --template=C:\Users\sanu0074\AppData\Roaming\npm-cache\_git-r
emotes\_templates --mirror git://github.com/felixge/node-mysql.git C:\Users\sanu
0074\AppData\Roaming\npm-cache\_git-remotes\git-github-com-felixge-node-mysql-gi
t-80878665: undefined
npm ERR! git clone --template=C:\Users\sanu0074\AppData\Roaming\npm-cache\_git-r
emotes\_templates --mirror git://github.com/felixge/node-mysql.git C:\Users\sanu
0074\AppData\Roaming\npm-cache\_git-remotes\git-github-com-felixge-node-mysql-gi
t-80878665: undefined
npm WARN addRemoteGit Error: not found: git
npm WARN addRemoteGit at F (C:\Program Files\nodejs\node_modules\npm\node_mo
dules\which\which.js:72:28)
npm WARN addRemoteGit at E (C:\Program Files\nodejs\node_modules\npm\node_mo
dules\which\which.js:75:29)
npm WARN addRemoteGit at C:\Program Files\nodejs\node_modules\npm\node_modul
es\which\which.js:83:16
npm WARN addRemoteGit at FSReqWrap.oncomplete (fs.js:95:15)
npm WARN addRemoteGit felixge/node-mysql resetting remote C:\Users\sanu0074\App
Data\Roaming\npm-cache\_git-remotes\https-github-com-felixge-node-mysql-git-cb83
b7f6 because of error: { [Error: not found: git] code: 'ENOGIT' }
npm ERR! git clone --template=C:\Users\sanu0074\AppData\Roaming\npm-cache\_git-r
emotes\_templates --mirror https://github.com/felixge/node-mysql.git C:\Users\sa
nu0074\AppData\Roaming\npm-cache\_git-remotes\https-github-com-felixge-node-mysq
l-git-cb83b7f6: undefined
npm ERR! git clone --template=C:\Users\sanu0074\AppData\Roaming\npm-cache\_git-r
emotes\_templates --mirror https://github.com/felixge/node-mysql.git C:\Users\sa
nu0074\AppData\Roaming\npm-cache\_git-remotes\https-github-com-felixge-node-mysq
l-git-cb83b7f6: undefined
npm WARN addRemoteGit Error: not found: git
npm WARN addRemoteGit at F (C:\Program Files\nodejs\node_modules\npm\node_mo
dules\which\which.js:72:28)
npm WARN addRemoteGit at E (C:\Program Files\nodejs\node_modules\npm\node_mo
dules\which\which.js:75:29)
npm WARN addRemoteGit at C:\Program Files\nodejs\node_modules\npm\node_modul
es\which\which.js:83:16
npm WARN addRemoteGit at FSReqWrap.oncomplete (fs.js:95:15)
npm WARN addRemoteGit felixge/node-mysql resetting remote C:\Users\sanu0074\App
Data\Roaming\npm-cache\_git-remotes\git-github-com-felixge-node-mysql-git-984047
cf because of error: { [Error: not found: git] code: 'ENOGIT' }
npm ERR! git clone --template=C:\Users\sanu0074\AppData\Roaming\npm-cache\_git-r
emotes\_templates --mirror git@github.com:felixge/node-mysql.git C:\Users\sanu00
74\AppData\Roaming\npm-cache\_git-remotes\git-github-com-felixge-node-mysql-git-
984047cf: undefined
npm ERR! git clone --template=C:\Users\sanu0074\AppData\Roaming\npm-cache\_git-r
emotes\_templates --mirror git@github.com:felixge/node-mysql.git C:\Users\sanu00
74\AppData\Roaming\npm-cache\_git-remotes\git-github-com-felixge-node-mysql-git-
984047cf: undefined
npm ERR! Windows_NT 6.1.7601
npm ERR! argv "C:\\Program Files\\nodejs\\\\node.exe" "C:\\Program Files\\nodejs
\\node_modules\\npm\\bin\\npm-cli.js" "install" "felixge/node-mysql"
npm ERR! node v0.12.7
npm ERR! npm v2.11.3
npm ERR! code ENOGIT

npm ERR! not found: git
npm ERR!
npm ERR! Failed using git.
npm ERR! This is most likely not a problem with npm itself.
npm ERR! Please check if you have git installed and in your PATH.

npm ERR! Please include the following file with any support request:
npm ERR! C:\Users\sanu0074\WebstormProjects\test\npm-debug.log

Похоже что ругается на GIT, но он установлен и работает

Оптимизайка
На сайте с 11.03.2012
Offline
396
#3
Sanu0074:
Похоже что ругается на GIT, но он установлен и работает

Который из них? В этом же рабочем каталоге, команда git --version что выдаёт?

Sanu0074
На сайте с 31.08.2012
Offline
110
#4

Выдает git version 1.9.5.msysgit.1

Вот что в git bash нарисовало при установке:

png sdas.png
Sanu0074
На сайте с 31.08.2012
Offline
110
#5

Оптимизайка, p.s. выполнил так команду:

npm install node-mysql

Заработало, хотя на гитхабе так написано

npm install felixge/node-mysql


---------- Добавлено 27.07.2015 в 02:22 ----------

Но, как же теперь сделать poll глобальным? Я не оч что-то пойму...
Оптимизайка
На сайте с 11.03.2012
Offline
396
#6

Не очень понятно, что значит "глобальным". Инициализация подключения к базе выполняется в главном модуле, где у вас роутинг. А далее эта переменная доступна в замыканиях, т.е.

var express = require("express");

var mysql = require('mysql');

var pool = mysql.createPool({

connectionLimit : 10,

host : 'example.org',

user : 'bob',

password : 'secret'

});

var app = express();

app.get("/",function(req,res){

pool.query(...);

});

app.listen(8000);

Sanu0074
На сайте с 31.08.2012
Offline
110
#7

Оптимизайка, вот я сделал в данном случае так:

var mysql = require('mysql');

var pool = mysql.createConnection({
connectionLimit : 10,
host : 'localhost',
user : 'test',
password : '1111',
database : 'test'
});

pool.connect(function(err){
if(!err) {
log.info("Database is connected ");
} else {
log.error("Error connecting database ");
}
});

var data = null;

pool.query('SELECT * FROM `table` ', function(err, rows, fields) {
//pool.end();
if (!err) {
data = {data: rows};
}
else {
log.error('Error while performing Query.' + err);
}
});


/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', data);
});

И при этом, выводится все из таблицы. Но, например, я сторонним инструментом (phpmyadmin) удалил из БД одну строку и добавил новых 10, а изменения на моей странице nodejs не отображаются, там по прежнему только изначальные данные. Отобразятся текущие данные, те изменения что произошли, только если перезапустить ноду. Почему так? что я делаю не правильно?

Оптимизайка
На сайте с 11.03.2012
Offline
396
#8

Потому что функция pool.query у вас выполняется ОДИН раз, далее все время берутся данные из переменной data.

Попробуйте для сравнения так:

/* GET home page. */

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

pool.query('SELECT * FROM `table` ', function(err, rows, fields) {

if (!err) {

var data = {data: rows};

res.render('index', data);

}

else {

log.error('Error while performing Query.' + err);

}

});

});

Sanu0074
На сайте с 31.08.2012
Offline
110
#9

Оптимизайка, туплю) теперь работает, спасибо!

---------- Добавлено 27.07.2015 в 02:50 ----------

Оптимизайка, получается, я так понимаю, в итоге, на каждый скрипт (как например в этом index.js) имеем одно вечное открытое подключение?

var mysql = require('mysql');

var pool = mysql.createConnection({
connectionLimit : 10,
host : 'localhost',
user : 'test',
password : '1111',
database : 'test'
});

pool.connect(....

И это есть правильно?

Ну, например для какого-нибудь user.js, будет также как и в index.js объявлено

require('mysql');

var pool = mysql.createConnection({......


---------- Добавлено 27.07.2015 в 02:51 ----------

Sanu0074, или может есть смысл создать отдельный модуль, в нем приконнектиться раз, и потом юзать это по всему приложению?
Оптимизайка
На сайте с 11.03.2012
Offline
396
#10
Sanu0074:
или может есть смысл создать отдельный модуль, в нем приконнектиться раз, и потом юзать это по всему приложению?

Именно так. http://dailyjs.com/2012/01/26/effective-node-modules/

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий