Описание сервера баз данных

Устройство сервера.

Инфо-Сервер использует сетевые соединения по протоколу TCP/IP для подключения клиентов и обслуживания их запросов. На схеме голубыми прямоугольниками обзначены элементы сервера, реализованные в виде отдельных потоков (threads). Поток сервера баз данных создает серверный сокет на порте 85 (по умолчанию), который используется для прослушивания сети в ожидании подключения новых клиентов. При поступлении запроса на подключение клиента создается поток клиента, который берет на себя всю дальнейшую работу с новым соединением. Поток клиента выполняет последовательно следующие функции: прослушивание соединения в ожидании запроса клиента, постановка полученного запроса в очередь (общую для всех клиентов), ожидание завершения выполнения запроса, отправка ответа клиенту. Таким образом, поток клиента выполняет работу по приему и отправке сетевых сообщений, освобождая тем самым время для выполнения запросов других клиентов. Поток клиента завершается при разрыве соединения клиентом, при ошибке соединения или при остановке сервера. Если поток клиента завершился, а запросы этого клиента еще выполняются, то просто ответы на эти запросы не будут отправлены. Клиентская библиотека Инфо-Сервера 2.0 обеспечивает прозрачное для пользователя создание нового TCP/IP соединения при отправке запроса, если старое соединение было разорвано по какой-то причине. Благодаря тому, что сетевое соединение с клиентом не привязано к базе данных и имени пользователя, Инфо-Сервер может не заботиться об обработке смены базы данных и текущего пользователя в клиентской программе. В контексте одного соединения могут поступать запросы к разным базам данных и от лица разных пользователей. Идентификация клиентских соединений происходит по целочисленному идентификатору (id), а также его характеризуют адрес и порт клиента. Порт клиента назначается автоматически и он будет разным для нескольких экземпляров клиентских программ, запущенных на одном компьютере.

 

Для выполнения запросов клиентов используется пул выполняющих потоков. Пул может содержать от 1 до 10 потоков в зависимости от настройки в файле infosrv2.ini. Запросы в разных потоках пула выполняются параллельно, что позволяет эффективно использовать ресурсы современных многоядерных процессоров. Выполняющие потоки не привязаны к клиенту и базе данных. Один из освободившихся выполняющих потоков забирает из очереди запросов следующий запрос и приступает к его выполнению. Очередь запросов организована по принципу FIFO и не поддерживает приоритетов запросов. После завершения выполнения запроса, поток выполнения формирует ответ и передает его ожидающему потоку клиента. Во избежании бесконечного ожидания ответа клиентом при зацикливании или другой ошибке выполнения запроса, время ожидания ответа клиентом ограничено. Соответствующий параметр можно задать в файле infosrv2.ini, по умолчанию максимальное время ожидания ответа составляет 10 минут. Пул потоков время от времени производит мониторинг выполняющих потоков. При отказе одного или нескольких потоков пула, работу продолжают остальные. При отказе всех потоков пула производится автоматический перезапуск сервера.

Каждый запрос содержит идентификатор базы данных (директорию) и имя пользователя. Выполняющий поток распаковывает параметры запроса и диспетчеризирует запрос в зависимости от его типа и базы данных. При первом обращении к определенной базе данных происходит ее открытие. Мониторингом списка открытых баз данных занимается поток сервера баз данных. Базы данных, к которым не было обращений в течении определенного времени, закрываются. Время неактивности базы данных до ее закрытия можно задать в файле infosrv2.ini, по умолчанию оно составляет 5 минут. К открытой базе данных выполняющие потоки направляют SQL-запросы, позволяющие в локальном режиме производить ее модификацию. Открытая база данных содержит, помимо BDE-соединения, список логических блокировок и значение автоинкрементального счетчика. После закрытия базы данных и ее повторного открытия логические блокировки удаляются, а для автоикрементального значения требуется вычисление.

Типы запросов.

Инфо-Сервер 2.0 поддерживает 5 типов запросов.

Самый простой тип запроса - выполнение операторов SQL INSERT, UPDATE и DELETE. Параметром запроса является строка SQL-запроса. Ответом на запрос этого типа является признак успешности его выполнения или информация об ошибке.

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

Инфо-Сервер поддерживает списки блокировок записей в таблицах для каждой базы данных. В зависимости от имени таблицы хранится список целочисленных идентификаторов заблокированных записей и имя заблокировавшего пользователя (для каждой записи). Запрос управления блокировками имеет 3 подтипа: установка блокировки, снятие блокировки, снятие всех блокировок. Запрос установки блокировки пытается добавить блокировку для указанного имени таблицы и целочисленного идентификатора записи. В случае, когда запись не заблокирована, в ответе передается признак успешной установки блокировки. Если запись уже заблокирована, то передается признак отказа и имя заблокировавшего пользователя. Запрос снятия блокировки удаляет запись о блокировке заданной записи из списка блокировок. В ответе возвращается признак успешного снятия или признак, что запись не была заблокирована. Запрос снятия всех блокировок позволяет принудительно очистить все логические блокировки для базы данных.

Запрос сохранения результата запроса позволяет записать результат SQL запроса SELECT в новую таблицу заданного типа. Параметрами запроса является строка SQL-запроса, имя таблицы для сохранения и ее тип: "PARADOX" или "DBASE". В результате выполнения в директории базы данных создается соответствующая таблица с результатами запроса. При существовании такой таблицы происходит перезапись. Ответом на запрос этого типа является признак успешности его выполнения или информация об ошибке.

Основная страница.

Hosted by uCoz