powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не работает isc_dpb_num_buffers
13 сообщений из 13, страница 1 из 1
Не работает isc_dpb_num_buffers
    #38879562
NaumOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Раньше увеличивал размер кэша установкой этого параметра во время соединения с сервером (весьма удобно перед большими вычислениями). Сегодня заметил, что размер кэша перестал меняться. Установка в firebird.conf DefaultDbCachePages или gfix`ом/IBExpert`ом непосредственно в базе работает. В чем может быть дело? И каковы приоритеты этих настроек? Пока я вижу что размер буфера прописанный в базе преобладает над указанным в конфиге сервера. Логично. Но как вернуть этот размер на дефолтный, чтобы использовался параметр сервера?
FB 2.5.3, Windows Server 2003.
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879564
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SS или CS? SYSDBA или регулярный юзер?
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879568
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaumOffНо как вернуть этот размер на дефолтный, чтобы использовался параметр сервера?
сюрприз - тем же gfix-ом
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879571
NaumOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimitr,
Ах да, Classic и SYSDBA.
Видимо gfix`ом просто в 0 надо указать. Торможу.
Сейчас еще один эксперимент провел. Задрал кэш в конфиге сервера, в коннекте указал кэш поменьше (да вообще любой вроде), смотрю в IbExperte выделенный кэш-100 страниц. Откуда эта цифра то?
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879582
NaumOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем dpb-константа работает... но позволяет указать максимум 255 страниц. Если свыше - берется какое-то рандомное значение близкое к 200.
В принципе для клиент-серверного приложения более чем достаточно, но для моих целей я бы пару гигабайт не пожалел. Пойду другим путем.
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879583
NaumOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу приоритетов... num_buffers при коннекте бьет параметр в конфиге сервера, параметр в базе бьет всех.
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879585
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaumOffВ общем dpb-константа работает... но позволяет указать максимум 255 страниц. Если свыше - берется какое-то рандомное значение близкое к 200.
иожет ты как-то криво ее кладешь в DPB?
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879601
NaumOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал в IBExpert. Вот на FibPlus
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  
with FIBDatabase.DBParams do
  begin
    Clear;
    Add('lc_ctype=WIN1251');
    Add('user_name=SYSDBA');
    Add('password=masterkey');
    Add('isc_dpb_num_buffers=500');
  end;
  with FIBDatabase do
  begin
    SQLDialect := 3;
    DatabaseName := 'c:\BASE.FDB';
    Connected := True;
    ShowMessage(IntToStr(NumBuffers));
    Close;
  end;


Результат тот же. При num_buffers=500 реально выделяет кэш под 244 страницы.
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879620
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaumOffПробовал в IBExpert. Вот на FibPlus
Это проблема Fib+. Жалуйся в их саппорт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879658
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЭто проблема Fib+На тех исходниках фибов, что есть у меня (может в новее починено?) бага точно есть, проверил в отладчике. Берется тупо один байт (остаток от деления на 256)и этот хвост в один байт прицепляется к DPB и отправляется серверу.
Dimitry SibiryakovЖалуйся в их саппорт.Самое время.
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879660
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
было так
Код: pascal
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.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
(*
 * GenerateDPB -
 *  Given a string containing a textual representation
 *  of the database parameters, generate a database
 *  parameter buffer, and return it and its length
 *  in DPB and DPBLength, respectively.
 *)
procedure GenerateDPB(sl: TStrings; var DPB: String;
  var DPBLength: Short);
var
  i : integer;
  j, DPBVal:integer;
  param_name, param_value: String;
  pval: Integer;
begin
  (*
   * The DPB is initially empty, with the exception that
   * the DPB version must be the first byte of the string.
   *)
  DPBLength := 1;
  DPB := Char(isc_dpb_version1);
  (*
   * Iterate through the textual database parameters, constructing
   * a DPB on-the-fly.
   *)
  for i := 0 to sl.Count - 1 do
  begin
    (*
     * Get the parameter's name and value from the list,
     * and make sure that the name is all lowercase with
     * no leading 'isc_dpb_' prefix
     *)
    sl[i]:=FastTrim(sl[i]);
    if sl[i]='' then Continue;

    GetNameAndValue(sl[i],param_name,param_value);
    DoLowerCase(param_name);

    if (param_name[1]=DPBPrefix[1]) and (Pos(DPBPrefix, param_name) = 1) then
       param_name:=FastCopy(param_name,Length(DPBPrefix)+1,MaxInt);
//      Delete(param_name, 1, Length(DPBPrefix));
    (*
     * We want to translate the parameter name to some integer
     * value. We do this by scanning through a list of known
     * database parameter names (DPBConstantNames, defined above).
     *)
    if DPBConstants.Find(param_name,j) then
      DPBVal :=Integer(DPBConstants.Objects[j])
    else
      DPBVal := 0;

    (*
     * A database parameter either contains a string value (case 1)
     * or an integer value (case 2)
     * or no value at all (case 3)
     * or an error needs to be generated (case else)
     *)
    case DPBVal of
      isc_dpb_user_name, isc_dpb_password, isc_dpb_password_enc,
      isc_dpb_sys_user_name, isc_dpb_license, isc_dpb_encrypt_key,
      isc_dpb_lc_messages, isc_dpb_lc_ctype,
      isc_dpb_sql_role_name,isc_dpb_sql_dialect,
      isc_dpb_instance_name, isc_dpb_old_file
     :
      begin
        if DPBVal = isc_dpb_sql_dialect then
          param_value[1] := Char(Ord(param_value[1]) - 48);

        DPB := DPB +
               Char(DPBVal) +
               Char(Length(param_value)) +
               param_value;
        Inc(DPBLength, 2 + Length(param_value));
      end;
      isc_dpb_num_buffers, isc_dpb_dbkey_scope, isc_dpb_force_write,
      isc_dpb_no_reserve, isc_dpb_damaged, isc_dpb_verify,
      isc_dpb_dummy_packet_interval, isc_dpb_connect_timeout,
      isc_dpb_online_dump, isc_dpb_overwrite, isc_dpb_old_file_size
      :
      begin
        DPB := DPB +Char(DPBVal) +#1+Char(StrToInt(param_value));
        Inc(DPBLength, 3);
      end;
      isc_dpb_sweep:
      begin
        DPB := DPB +Char(DPBVal) +#1 +Char(isc_dpb_records);
        Inc(DPBLength, 3);
      end;
      isc_dpb_sweep_interval:
      begin
        pval := StrToInt(param_value);
        DPB := DPB +Char(DPBVal) +#4 +
               PChar(@pval)[0] +
               PChar(@pval)[1] +
               PChar(@pval)[2] +
               PChar(@pval)[3];
        Inc(DPBLength, 6);
      end;
      isc_dpb_activate_shadow, isc_dpb_delete_shadow, isc_dpb_begin_log,
      isc_dpb_quit_log:
      begin
        DPB := DPB +Char(DPBVal) +#1#0;
        Inc(DPBLength, 3);
      end;

      //
      isc_dpb_no_garbage_collect,isc_dpb_garbage_collect:
      begin
        DPB := DPB + Char(DPBVal) + #1#0;
        Inc(DPBLength, 3);
      end;
    else
      begin
        if (DPBVal > 0) and (DPBVal <= isc_dpb_last_dpb_constant) then
          FIBError(feDPBConstantNotSupported,[DPBConstantNames[DPBVal]])
        else
          FIBError(feDPBConstantUnknown, [param_name]);
      end;
    end;
  end;
end;


Если исправить вот так, то баг уходит:
Код: pascal
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.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
(*
 * GenerateDPB -
 *  Given a string containing a textual representation
 *  of the database parameters, generate a database
 *  parameter buffer, and return it and its length
 *  in DPB and DPBLength, respectively.
 *)
procedure GenerateDPB(sl: TStrings; var DPB: String;
  var DPBLength: Short);
var
  i : integer;
  j, DPBVal:integer;
  param_name, param_value: String;
  pval: Integer;
begin
  (*
   * The DPB is initially empty, with the exception that
   * the DPB version must be the first byte of the string.
   *)
  DPBLength := 1;
  DPB := Char(isc_dpb_version1);
  (*
   * Iterate through the textual database parameters, constructing
   * a DPB on-the-fly.
   *)
  for i := 0 to sl.Count - 1 do
  begin
    (*
     * Get the parameter's name and value from the list,
     * and make sure that the name is all lowercase with
     * no leading 'isc_dpb_' prefix
     *)
    sl[i]:=FastTrim(sl[i]);
    if sl[i]='' then Continue;

    GetNameAndValue(sl[i],param_name,param_value);
    DoLowerCase(param_name);

    if (param_name[1]=DPBPrefix[1]) and (Pos(DPBPrefix, param_name) = 1) then
       param_name:=FastCopy(param_name,Length(DPBPrefix)+1,MaxInt);
//      Delete(param_name, 1, Length(DPBPrefix));
    (*
     * We want to translate the parameter name to some integer
     * value. We do this by scanning through a list of known
     * database parameter names (DPBConstantNames, defined above).
     *)
    if DPBConstants.Find(param_name,j) then
      DPBVal :=Integer(DPBConstants.Objects[j])
    else
      DPBVal := 0;

    (*
     * A database parameter either contains a string value (case 1)
     * or an integer value (case 2)
     * or no value at all (case 3)
     * or an error needs to be generated (case else)
     *)
    case DPBVal of
      isc_dpb_user_name, isc_dpb_password, isc_dpb_password_enc,
      isc_dpb_sys_user_name, isc_dpb_license, isc_dpb_encrypt_key,
      isc_dpb_lc_messages, isc_dpb_lc_ctype,
      isc_dpb_sql_role_name,isc_dpb_sql_dialect,
      isc_dpb_instance_name, isc_dpb_old_file
     :
      begin
        if DPBVal = isc_dpb_sql_dialect then
          param_value[1] := Char(Ord(param_value[1]) - 48);

        DPB := DPB +
               Char(DPBVal) +
               Char(Length(param_value)) +
               param_value;
        Inc(DPBLength, 2 + Length(param_value));
      end;
      isc_dpb_dbkey_scope, isc_dpb_force_write,
      isc_dpb_no_reserve, isc_dpb_damaged, isc_dpb_verify,
      isc_dpb_dummy_packet_interval, isc_dpb_connect_timeout,
      isc_dpb_online_dump, isc_dpb_overwrite, isc_dpb_old_file_size
      :
      begin
        DPB := DPB +Char(DPBVal) +#1+Char(StrToInt(param_value));
        Inc(DPBLength, 3);
      end;
      isc_dpb_sweep:
      begin
        DPB := DPB +Char(DPBVal) +#1 +Char(isc_dpb_records);
        Inc(DPBLength, 3);
      end;
      isc_dpb_num_buffers, isc_dpb_sweep_interval:
      begin
        pval := StrToInt(param_value);
        DPB := DPB +Char(DPBVal) +#4 +
               PChar(@pval)[0] +
               PChar(@pval)[1] +
               PChar(@pval)[2] +
               PChar(@pval)[3];
        Inc(DPBLength, 6);
      end;
      isc_dpb_activate_shadow, isc_dpb_delete_shadow, isc_dpb_begin_log,
      isc_dpb_quit_log:
      begin
        DPB := DPB +Char(DPBVal) +#1#0;
        Inc(DPBLength, 3);
      end;

      //
      isc_dpb_no_garbage_collect,isc_dpb_garbage_collect:
      begin
        DPB := DPB + Char(DPBVal) + #1#0;
        Inc(DPBLength, 3);
      end;
    else
      begin
        if (DPBVal > 0) and (DPBVal <= isc_dpb_last_dpb_constant) then
          FIBError(feDPBConstantNotSupported,[DPBConstantNames[DPBVal]])
        else
          FIBError(feDPBConstantUnknown, [param_name]);
      end;
    end;
  end;
end;

...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38879707
NaumOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky,
В точку! IBExpert же тоже на фибах написан. И помню ведь, что раньше все работало. Большое спасибо.
...
Рейтинг: 0 / 0
Не работает isc_dpb_num_buffers
    #38880605
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaumOffИ помню ведь, что раньше все работало.Ты buzz-у отписал, чтоб он в мейнстриме поправил?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не работает isc_dpb_num_buffers
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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