Советы дня. Работа с Firebird 2.5 через связанный сервер.
Привет всем.
Вчера консультировал клиента, по поводу ряда проблем при работе с базой под FB2.5 через связанный сервер MSSQL. Используется встроенный клиент для Firebird (dbclient_type=fb.direct).
Проблема #1
Первый запрос к базе выполняется около 30 секунд.
Причина заключается в том, что MSSQL читает метаданные конструкций, используемых в запросе. По умолчанию IBProvider грузит и кэширует все данные для каждой схемы. То есть, MSSQL хочет получить данные по колонкам для одной таблицы. А провайдер, чтобы два раза не вставать, загружает данные о колонках всех таблиц и представлений (VIEW).
Это поведение можно изменить, указав в строке подключения «schema_cache=0».
Проблема #2
Странные ошибки в логе сервера.
SVRERP01 Mon Sep 14 14:59:59 2020
SERVER/process_packet: connection rejected for SQLSERVERAGENT.-1.-1
Провайдер, по умолчанию, сначала пытается подключиться к FB с использованием 13-го протокола (FB3). Других протоколов он не предлагает. Потом он пытается подключиться с использованием 12, 11 и 10-го протоколов.
FB2.5 как раз на эту первую попытку и ругается.
Указываем в строке подключения «remote:protocol=12» и заставляем провайдер сразу использовать правильный протокол.
Проблема #3
До кучи, указал на то, что в строке подключения используется устаревший (хотя и рабочий) вариант указания сервера и базы данных — «SERVERNAME:d:\database\DB.FDB».
Провайдер (точнее Windows) может сначала пытаться подключаться к серверу через TCP/IP v6, а потом через TCP/IP v4.
Firebird 2.5 не поддерживает TCP/IP v6.
Имеет смысл явно указывать версию TCP/IP v4 в строке подключения, используя «новый» формат описания расположения базы данных — «inet4://SERVERNAME/d:\database\DB.FDB».
Это ощутимо сократит время подключения к базе данных под/на FB2.5.