(DBServer_MySQL) Реализация сервиса ведения БД на основе MySQL

Общее описание работы DBServer_MySQL

Сервис предназначен для работы с БД MySQL. В его задачи входит сохранение всех событий происходищих в системе в БД. К этим событиям относятся изменение состояния датчиков, различные логи работы процессов и т.п. К моменту запуска, подразумевается, что неободимые таблицы уже созданы, все необходимые настройки mysql сделаны.
При работе с БД, сервис в основном пишет в БД. Обработка накопленных данных ведётся уже другими программами (web-интерфейс).
Для повышения надежности DBServer переодически ( DBServer_MySQL::PingTimer ) проверяет наличие связи с сервером БД. В случае если связь пропала (или не была установлена при старте) DBServer пытается вновь каждые DBServer::ReconnectTimer произвести соединение. При этом все запросы которые поступают для запии в БД, но не мгут быть записаны складываются в буфер (см. Защита от потери данных).
Предупреждения:
При каждой попытке восстановить соединение DBServer заново читает конф. файл. Поэтому он может подхватить новые настройки.
Необходимо сделать:
Может не сохранять текст, если задан код... (для экономии в БД)

Настройка DBServer

Объект DBServer берёт настройки из конфигурационного файла из секции <LocalDBServer>. Возможно задать следующие параметры:

Защита от потери данных

Для того, чтобы на момент отсутствия связи с БД данные по возможности не потерялись, сделан "кольцевой" буфер. Размер которго можно регулировать параметром "--dbserver-buffer-size" или параметром bufferSize=".." в конфигурационном файле секции "<LocalDBSErver...>".

Механизм построен на том, что если связь с mysql сервером отсутствует или пропала, то сообщения помещаются в колевой буфер, который "опустошается" как только она восстановится. Если связь не восстановилась, а буфер достиг максимального заданного размера, то удаляются более ранние сообщения. Эту логику можно сменить, если указать параметр "--dbserver-buffer-last-remove" или bufferLastRemove="1", то терятся будут сообщения добавляемые в конец.

Таблицы MySQL

К основным таблицам относятся следующие:
DROP TABLE IF EXISTS `main_history`;
CREATE TABLE `main_history` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` date NOT NULL,
  `time` time NOT NULL,
  `time_usec` int(10) unsigned NOT NULL,
  `sensor_id` int(10) unsigned NOT NULL,
  `value` double NOT NULL,
  `node` int(10) unsigned NOT NULL,
  `confirm` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `main_history_sensor_id` (`sensor_id`),
  CONSTRAINT `sensor_id_refs_id_3d679168` FOREIGN KEY (`sensor_id`) REFERENCES `main_sensor` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `main_emergencylog`;
CREATE TABLE `main_emergencylog` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` date NOT NULL,
  `time` time NOT NULL,
  `time_usec` int(10) unsigned NOT NULL,
  `type_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `main_emergencylog_type_id` (`type_id`),
  CONSTRAINT `type_id_refs_id_a3133ca` FOREIGN KEY (`type_id`) REFERENCES `main_emergencytype` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `main_emergencyrecords`;
CREATE TABLE `main_emergencyrecords` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` date NOT NULL,
  `time` time NOT NULL,
  `time_usec` int(10) unsigned NOT NULL,
  `log_id` int(11) NOT NULL,
  `sensor_id` int(10) unsigned NOT NULL,
  `value` double NOT NULL,
  PRIMARY KEY (`id`),
  KEY `main_emergencyrecords_log_id` (`log_id`),
  KEY `main_emergencyrecords_sensor_id` (`sensor_id`),
  CONSTRAINT `log_id_refs_id_77a37ea9` FOREIGN KEY (`log_id`) REFERENCES `main_emergencylog` (`id`),
  CONSTRAINT `sensor_id_refs_id_436bab5e` FOREIGN KEY (`sensor_id`) REFERENCES `main_sensor` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Документация по UniSet. Последние изменения: Mon Dec 3 16:14:28 2012. Создано системой  doxygen 1.5.9