Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.08.2014, 10:28
Интересующийся
Отправить личное сообщение для Chrome Посмотреть профиль Найти все сообщения от Chrome
 
Регистрация: 17.01.2013
Сообщений: 21

Nodejs и mysql
Данный код каждую секунду доблит базу и отсылает строчку клиенту.
var http = require('http');
var mysql      = require('mysql');
var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'test'
 
});
 
connection.connect();
 
var sockjs = require('sockjs');
 
var echo = sockjs.createServer();
echo.on('connection', function(conn) {
 
    setInterval(function(){
    connection.query('SELECT id FROM  users ', function(err, rows, fields) {
        if (err) throw err;
 
        conn.write('The solution is: '+rows[1]['id']);
    });
    },1000);
 
    conn.on('data', function(message) {
        console.log(message);
    });
    conn.on('close', function() {});
});
 
var server = http.createServer();
echo.installHandlers(server, {prefix:'/echo'});
server.listen(9999, '0.0.0.0');


Можно ли избавится от setInterval и установить соединение с таблицой базы на прямую другим способом? Или данная реализация является верной и других решений нет?
Ответить с цитированием
  #2 (permalink)  
Старый 03.08.2014, 13:29
Интересующийся
Отправить личное сообщение для Chrome Посмотреть профиль Найти все сообщения от Chrome
 
Регистрация: 17.01.2013
Сообщений: 21

Может кому формулировка вопроса непонята?
Ответить с цитированием
  #3 (permalink)  
Старый 03.08.2014, 13:45
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Дык драйвер БД и так по сокетам общается с БД. Ты главное connection не убивай после выполнения работы, ибо соединения с БД - оч дорогая операция. Нода крутится в одном потоке, поэтому в ней нет смысла делать "пул соединений", а достаточно держать одно прогретое соединения и по нему ходить и это будет работать очень быстро.

Если тебе хочется писать код прямо на уровне СУБД, то MySQL так вроде не умеет (хотя можно создать хранимку), но есть другие решение, например Tarantool (правд там Lua, а не JS).
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 03.08.2014 в 14:09.
Ответить с цитированием
  #4 (permalink)  
Старый 03.08.2014, 15:08
Интересующийся
Отправить личное сообщение для Chrome Посмотреть профиль Найти все сообщения от Chrome
 
Регистрация: 17.01.2013
Сообщений: 21

Не могли бы вы показать на уровне когда пожалуйста. Как это будет выглядеть. К примеру если поле id будет изменено то Сервер отправляет Клиенту уведомление о новом значении поля id? Я с ноде связался очень недавно. И для меня большая часть терминов темный лес. К примеру Кое соединение является прогретым? И вообще как его прогреть ? Может на уровне кода я смогу легче понять хотя бы поверхностно. А так спасибо за помощь кое что удалось подчеркнуть для себя
Ответить с цитированием
  #5 (permalink)  
Старый 03.08.2014, 15:19
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Примитивный пример

var connectionCache;
function createConnection(params) {
    connectionCache = connectionCache  || mysql.createConnection(params);
    return connectionCache;
}


Т.е. mysql.createConnection делается один раз, а затем возвращается ссылка из кеш переменной. Конечно лучше написать дочерний класс от mysql, который будет это делать, туда же можно добавить логику кеширования на уровне приложения.

***

Вообще желательно тщательно ознакомиться с докой фреймворка (если вы таковой юзаете) и драйвера БД. Посмотреть не делают ли они это сами, но суть проста: соединение - это очень дорогая операция и поэтому его нужно кешировать.

Что касается самой БД, то главное, чтобы она целиком влезала в оперативу и были нормальные индексы. Если база не влезает в оперативу целиком, то будет всё тормозить и придётся делать сегментирование. Если сегментирование не закладывать сразу, то потом будет мучительно больно всё переписывать
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 03.08.2014 в 15:24.
Ответить с цитированием
  #6 (permalink)  
Старый 03.08.2014, 16:32
Интересующийся
Отправить личное сообщение для Chrome Посмотреть профиль Найти все сообщения от Chrome
 
Регистрация: 17.01.2013
Сообщений: 21

что касается
var connectionCache;
function createConnection(params) {
    connectionCache = connectionCache  || mysql.createConnection(params);
    return connectionCache;
}

Это понятно.

Меня изначально интересовала строчка с setInterval Можно ли как то избавиться от нее и не допрашивать каждый раз таблицу на предмет изменений, а сделать так что бы таблица сам говорила что в ней появились изменения. А вы перешил на подключение к базе. Или достаточно установить хешь при подключении к базе. И затем можно долбить ее сколь угодно в интревале И ничего страшного не будет?
Ответить с цитированием
  #7 (permalink)  
Старый 03.08.2014, 17:23
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
Можно ли как то избавиться от нее и не допрашивать каждый раз таблицу на предмет изменений, а сделать так что бы таблица сам говорила что в ней появились изменения.
Это от СУБД зависит, я знаю что MySQL поддерживает тригеры и хранимки, можно покопать в эту сторону. Т.е. да, есть СУБД, где такое делается легко, что касается MySQL я хз.

Цитата:
А вы перешил на подключение к базе.
Ну, потому что если подключение делается один раз, то нет ничего страшного в том, чтобы по интервалу туда долбиться (если конечно запрос не очень тяжёлый), т.е. - это нормально.

***

Можно поверх MySQL одеть Redis или MemCache, если MySQL будет тупить.
__________________
kobezzza
code monkey
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WebSocket - nodejs SVARAI AJAX и COMET 2 17.02.2014 08:41
Не подключается MySql super-php Серверные языки и технологии 1 02.08.2013 01:26
немного об nodejs qwermjk AJAX и COMET 5 15.02.2013 10:57
extjs grid + mysql Jeka57 ExtJS 4 26.11.2012 19:19
Comet: NodeJS - с чего начать разработку? Vulkan AJAX и COMET 13 27.11.2010 19:25