powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
25 сообщений из 56, страница 2 из 3
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269443
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТы это из процедур, функций, udf и прочего никак не можешь выполнить аналогичную проверку, или использовать подобный механизм для проверки блокированности своих объектов (мютексов, семафоров и проч). Потому что серверу наплевать на твои объекты. А кроме активного коннекта эти объекты проверять и блокировать-разблокировать больше некому. Еще раз привожу пример:
- коннект выполняет функцию блокировки мютекса
- коннект (процесс) отваливается.
- мютекс заблокирован, а кто его заблокировал (и жив он или нет) - неизвестно.
аминь. И снять такую блокировку можно по таймауту. Но вот проблема - у мютекса нет свойства "время блокировки".Проблема, в большей степени, обходится созданием собственных объектов блокировки в разделяемой памяти со штампом времени и фиксированным маленьким таймаутом (к примеру, 500мс), но начинает упираться в накладные расходы на маршалинг при вызове какой-нибудь UDF функции, типа hold_lock(:hndl_lock, CURRENT_TRANSACTION), продлевающей блокировку, а также сильно упираться в использование транзакций wait. Последнее вовсе начисто отбивает желание самостоятельной реализации через UDF, так как любая блокировка записей в конкурирующей транзакции, дольше заданного времени, приведет к автоматической разблокировки ресурса и неопределенному дальнейшему поведению.
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269445
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineТаблоид ее когда-то давно решал. В академических целях, как у него обычно водится :)Так и я больше в академических целях, так как никто подобных задач передо мной не ставит, а свою собственную мысль не загонишь исключительно в рамки тех.заданий.
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269467
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev а свою собственную мысль не загонишь исключительно в рамки тех.заданий.А как же ты тогда свои тех. задания пишешь?
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269473
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, чукча не писатель, чукча читатель.
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269485
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел решение Таблоида (самому интерессно стало): 18162493 .
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269507
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devYuRock, чукча не писатель, чукча читатель. Ну а когда для себя что-то пишешь или для души? Или большой неописанный в тз кусок?
Ты что, алгоритм хотябы вначале не описываешь? Что и как работать будет в будущем твоем творении?

Ведь именно законченное, проработанное тз и экономит время и ресурсы. Быстрее сначала продумать и написать алгоритм (на русском языке, например), а потом закодить его спокойно и уверенно, чем сразу бросаться кодить пальцем в небо и затем либо переделывать 5 раз либо грабли и костыли оставлять. Наподобие внешних блокировок функций работы СУБД :)
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269510
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline, в принципе, то же самое и тоже без порта, но мне не понятно нафига там обращение к MON$IO_STAT и это:
select a.mon$server_pid + 0*(select count(*) from rdb$types,rdb$types)
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269523
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

читай комментарий dimitr выше втом топике
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269541
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

теперь заверни это все в триггеры on commit/on rollback, и получи тормоза (как и было у Таблоида).
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269543
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извращение с (select count(*) from rdb$types,rdb$types) IMHO лишнее, на момент любого опроса MON$-таблиц всегда должно было произойти как минимум одно страничное чтение и/или одна страничная запись. И уж точно более одного страничного фетча. Т.е. если в MON$IO_STATS для БД ноль, то это точно CS/SC, в SS такого быть не должно в принципе. Выполнять холостые 10000 чтений из RDB$TYPES это слишком дорогая перестраховка.
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269557
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

по сути архитектуру надо определить один раз в ON CONNECT триггере и запомнить её в контекстной переменной, а потом получать её от туда. Но решение с MON$ всё равно не очень, по крайней мере в 2.5, ибо может замедлить коннект. В системах где частые и короткоживущие коннекты это смерти подобно.

В 3.0 с MON$ уже лучше. Кроме того можно сделать функцию, которая получает архитектуру по требованию и кеширует это значение в тех же контекстных переменных, вместо размещения в ON CONNECT.
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269736
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline, попробовал сделать "красившэ":
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
CREATE OR ALTER EXCEPTION db__xGetOut 'Отвали!';
-- CREATE OR ALTER EXCEPTION db__xIamSS 'Я супер сервер!!!';
-- CREATE OR ALTER EXCEPTION db__xIamCS 'Классик';

SET TERM ^;
CREATE OR ALTER TRIGGER db__TR_CONN
  ON CONNECT
AS
  DECLARE VARIABLE remoteProcess VARCHAR(255) CHARACTER SET UTF8;
  DECLARE VARIABLE isSuperServer SMALLINT DEFAULT 0;
BEGIN
  IF (CURRENT_USER = 'SERVER_MON_USER') THEN
    BEGIN
      SELECT MON$REMOTE_PROCESS,
          Iif(MON$SERVER_PID = MON$REMOTE_PID, 1, 0)
        FROM MON$ATTACHMENTS
        WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION
          AND MON$REMOTE_PROTOCOL = 'TCPv4'
          AND MON$REMOTE_ADDRESS = '127.0.0.1'
          -- AND MON$REMOTE_PROCESS = MON$LOCAL_PROCESS
        INTO: remoteProcess, isSuperServer;
      IF (:remoteProcess IS NULL) THEN EXCEPTION db__xGetOut;
      -- IF (:isSuperServer = 1) THEN
      --   EXCEPTION db__xIamSS;
      -- ELSE
      --   EXCEPTION db__xIamCS;
    END
END^
SET TERM ;^

но в ХП с EXECUTE STATEMENT ... ON EXTERNAL DATA SOURCE исключения db__xIamSS и db__xIamCS не поймать через WHEN EXCEPTION ... DO. :(
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269741
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvтеперь заверни это все в триггеры on commit/on rollback, и получи тормоза (как и было у Таблоида).
Нафига их заворачивать в эти триггеры? Не проще сделать это в триггере ON CONNECT и сохранить через RDB$SET_CONTEXT ?
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269743
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, опередил. :)
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269795
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще странно, что нельзя отловить пользовательское исключение из EXECUTE STATEMENT ... ON EXTERNAL DATA SOURCE.

"Триггера на события CONNECT и DISCONNECT выполняются в специально созданной
для этого транзакции. Если при обработке триггера не было вызвано исключение, то
транзакция подтверждается. Не перехваченные исключения откатят транзакцию и:
• в случае триггера на событие CONNECT соединение разрывается, а исключения
возвращается клиенту;"


Пусть не по имени исключения, так как исключение выброшено не в текущем подключении к БД, но, хотя бы, по номеру.
Вот как-то так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
SET TERM ^;
CREATE OR ALTER PROCEDURE SERVER_MODE
  RETURNS
  (
    RET TAG2
  )
AS
  DECLARE VARIABLE attachName   VARCHAR(255) CHARACTER SET UTF8 DEFAULT NULL;
  DECLARE VARIABLE dbName       VARCHAR(255) CHARACTER SET UTF8 DEFAULT NULL;
  DECLARE VARIABLE connString   VARCHAR(255) CHARACTER SET UTF8 DEFAULT NULL;
  DECLARE VARIABLE xIamSS       INTEGER;
  DECLARE VARIABLE xIamCS       INTEGER;
BEGIN
  SELECT RDB$EXCEPTION_NUMBER
    FROM RDB$EXCEPTIONS
    WHERE RDB$EXCEPTION_NAME = 'DB__XIAMSS'
    INTO: xIamSS;
  SELECT RDB$EXCEPTION_NUMBER
    FROM RDB$EXCEPTIONS
    WHERE RDB$EXCEPTION_NAME = 'DB__XIAMCS'
    INTO: xIamCS;
  SELECT MON$ATTACHMENT_NAME,
      (SELECT MON$DATABASE_NAME FROM MON$DATABASE) AS DATABASE_NAME
    FROM MON$ATTACHMENTS
    WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION
    INTO: attachName, dbName;
  connString = '127.0.0.1/3050:' || Coalesce(attachName, dbName);
  EXECUTE STATEMENT ('SELECT Cast(NULL AS CHAR(2) CHARACTER SET ASCII FROM RDB$DATABASE')
    AS USER 'SERVER_MON_USER'
    PASSWORD '12345678'
    ROLE 'RDB$ADMIN'
    ON EXTERNAL DATA SOURCE :connString
    INTO: RET;
  WHEN EXCEPTION :xIamSS DO
    BEGIN
      RET = 'SS';
      SUSPEND;
    END
  WHEN EXCEPTION :xIamCS DO
    BEGIN
      RET = 'CS';
      SUSPEND;
    END
END^
SET TERM ;^

...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269799
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devВообще странно, что нельзя отловить пользовательское исключение из EXECUTE STATEMENT ... ON EXTERNAL DATA SOURCE.???
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269811
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad, на оба исключения (db__xIamSS и db__xIamCS) я получаю только GDSCODE = 335544921 и SQLSTATE = '42000'
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269813
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

решения у тебя какие-то проктостоматологические мягко говоря
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269816
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, а это и не решения вовсе. Так... Мысли вслух.
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269936
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devhvlad, на оба исключения (db__xIamSS и db__xIamCS) я получаю только GDSCODE = 335544921 и SQLSTATE = '42000'А почему ты решил, что должен получить что-то другое ? Ты доку по EXEC STMT читал ?
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39269946
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 7 июля 2016 г. 15:54:57:

Симонов Денис> решения у тебя какие-то проктостоматологические мягко говоряprofession de foi...

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39270014
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladА почему ты решил, что должен получить что-то другое ? Ты доку по EXEC STMT читал ??
"Каждое исключение, вызванное
оператором, возвращает eds_connection или eds_statement ошибки. Для обработки
исключений в коде PSQL вы должны использовать WHEN GDSCODE eds_connection,
WHEN GDSCODE eds_statement или WHEN ANY."


Это понятно, но хотелось бы как-то ловить... Прекрасно вижу сообщение об ошибке, выплюнутое из ХП SERVER_MODE, и пойманное на клиенте (в IBExpert):
335544517: exception 11
335544382: DB__XIAMSS
335544382: Я супер сервер!

а поймать не могу. :( Эх, если бы была какая-нибудь функция типа EXCEPTION(nestLevel), способная возвращать номер исключения из соединений соединения внешнего провайдера...
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39270036
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

зачем вся эта проктостоматология? Почему EDS просто не может вернуть имя архитектуры?
Подумай головным мозгом как перехватить исключения которых нет в твоей базе. Ведь EDS может подключаться не только к самой себе.
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39270107
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

кстати зачем тебе потребовал определить архитектуру? Это всё твоя шальная затея с мьютексами что ли? Все решения должны проектироваться так чтобы они работали независимо от архитектуры сервера.
...
Рейтинг: 0 / 0
Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
    #39270113
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисзачем вся эта проктостоматология? Почему EDS просто не может вернуть имя архитектуры?Хотя бы затем, чтобы, в данном случае, максимально ограничить и обезопасить "подключение" пользователя SERVER_MON_USER. Чтобы не ставить под угрозу целостность данных на сервере ФБ даже при отсутствие DMZ зоны за грамотно настроенным брандмауэром и наличие в сети хакера с инструментом ARP spoofing'а.

Симонов ДенисПодумай головным мозгом как перехватить исключения которых нет в твоей базе. Ведь EDS может подключаться не только к самой себе.Я уже писал, что это можно сделать по номеру исключения, а как я этот номер буду интерпретировать - мои проблемы. Например:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
WHEN ANY DO
  BEGIN
    nestLevel = 0;
    xn = EXCEPTION_NUMBER(nestLevel);  -- номер исключения уровня нашего подключения
    WHILE (:xn IS NOT NULL) DO
      BEGIN
        exception_number = xn;
        nestLevel = nestLevel + 1;
        xn = EXCEPTION_NUMBER(nestLevel); -- номер исключения уровня внешнего провайдера n+1
      END
    SUSPEND;
  END
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Кто как решал задачу определения архитектуры сервера v2.5 (Classic/Superserver) из ХП?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]