Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Освобождение памяти TIBSQL  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
var
  ibq: TIBSQL;
begin
  ibq := TIBSQL.Create(IBDatabase1);
  ibq.Transaction := TIBTransaction.Create(IBDatabase1);

  try
    ibq.SQL.Text := 'delete from table1';
    ibq.ExecQuery;
    ibq.Transaction.Commit;
  finally
    FreeAndNil(ibq);
  end;
end;


Будет ли удален ibq.Transaction := TIBTransaction или его надо отдельно удалять?
15 мар 20, 11:29    [22099293]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Polesov
Member

Откуда:
Сообщений: 692
antox

Будет ли удален ibq.Transaction := TIBTransaction или его надо отдельно удалять?

Будет при освобождении IBDatabase1.

Мне кажется, лучше при создании в качестве Owner указать ibq:
  ibq.Transaction := TIBTransaction.Create(ibq);

Тогда транзакция будет освобождена вместе с ibq.
15 мар 20, 11:41    [22099294]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Polesov
antox

Будет ли удален ibq.Transaction := TIBTransaction или его надо отдельно удалять?

Будет при освобождении IBDatabase1.

Мне кажется, лучше при создании в качестве Owner указать ibq:
  ibq.Transaction := TIBTransaction.Create(ibq);

Тогда транзакция будет освобождена вместе с ibq.


Отлично, пришлось только добавить

ibq.Transaction.DefaultDatabase := ibq.Database;
15 мар 20, 11:54    [22099297]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Док
Member

Откуда: Казань
Сообщений: 6592
antox
Будет ли удален ibq.Transaction := TIBTransaction или его надо отдельно удалять?

формально экземпляр объекта уничтожается автоматом при уничтожении owner'a. Но, представь, что в твоем коде создание экземпляра объекта транзакции завершилось фейлом. Ы?

зы. прокладки try..filnally/try..except не просто так придуманы:)
15 мар 20, 13:25    [22099331]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Док,

А при каком условии создание транзакции может завершиться ошибкой?

И да, бесит, что нет нормальной конструкции:
Try

Except

Finally

End


Сообщение было отредактировано: 15 мар 20, 13:32
15 мар 20, 13:31    [22099334]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4200
antox
И да, бесит, что нет нормальной конструкции:

Легко заменяется:
try
finally
 if Assigned(ExceptObject()) then;
end;
15 мар 20, 13:44    [22099338]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61137
antox> А при каком условии создание транзакции может завершиться ошибкой?

Наверняка, при проблемах с соединением (потеря связи, закрытие соединения со стороны сервера).
В случае эксепшена в триггере на старт транзакции - тоже, наверное (не помню уже, лень проверять).

Posted via ActualForum NNTP Server 1.5

15 мар 20, 13:47    [22099340]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
ъъъъъ
Member

Откуда:
Сообщений: 198
antox
  ibq := TIBSQL.Create(IBDatabase1);
  ibq.Transaction := TIBTransaction.Create(IBDatabase1);

  try
    ibq.SQL.Text := 'delete from table1';
    ibq.ExecQuery;
    ibq.Transaction.Commit;
  finally
    FreeAndNil(ibq);

Зачем вообще при создании объекта задавать владельца, если ты этот объект убиваешь сам?
15 мар 20, 14:00    [22099345]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Док
Member

Откуда: Казань
Сообщений: 6592
antox
А при каком условии создание транзакции может завершиться ошибкой?

Если брать шире, то неважно, при каких условиях. Важна методология. В любой классической книжке по Паскалю об этом говорится, когда описывается создание объектов и обработки исключительных ситуаций. Так что, в твоем случае можно написать как-то:
var
  ibq: TIBSQL;
  WriteTrans: TIBTransaction;
begin
  ibq := TIBSQL.Create(nil);
  try
    try
      WriteTrans:= TIBTransaction.Create(nil);

      with WriteTrans do
      begin
        //задаем параметры транзации, исключая дефолтовые свойства
      end;

      with ibq do
      begin
        SQL.Text := 'delete from table1';
        Transaction:= WriteTrans;
        //задаем остальные параметры кверей, исключая дефолтовые свойства
      end;
  
      try
        ibq.ExecQuery;
        ibq.Transaction.Commit;
      except
        on E:EIBError do
        begin
          ibq.Transaction.Rollback;
          ShowMessage(E.Message);
        end;
      end;
    finally
      FreeAndNil(WriteTrans)
    end;
  finally
    FreeAndNil(ibq);
  end;
end;


Сообщение было отредактировано: 15 мар 20, 14:24
15 мар 20, 14:23    [22099356]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
ъъъъъ
Member

Откуда:
Сообщений: 198
Гаджимурадов Рустам
antox> А при каком условии создание транзакции может завершиться ошибкой?

Наверняка, при проблемах с соединением (потеря связи, закрытие соединения со стороны сервера).
В случае эксепшена в триггере на старт транзакции - тоже, наверное (не помню уже, лень проверять).

Не, ошибок не будет, ничего не будет, пока с транзакцией работать не начнёшь. Это ведь всего лишь оболочка, экземпляр класса.
15 мар 20, 14:29    [22099364]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61137
Док
  ibq := TIBSQL.Create(nil);
  try
    try
      WriteTrans:= TIBTransaction.Create(nil);
 
    finally
      FreeAndNil(WriteTrans)
    end;
  finally
    FreeAndNil(ibq);
  end;
 end;


Тут двух блоков не нужно, одного достаточно.

Posted via ActualForum NNTP Server 1.5

15 мар 20, 14:34    [22099369]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61137
ъъъъъ> Не, ошибок не будет, ничего не будет, пока с транзакцией работать не начнёшь.

Да, это я в вопрос не вник, я про старт говорил. Сорри, короче.

Posted via ActualForum NNTP Server 1.5

15 мар 20, 14:35    [22099370]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Док
Member

Откуда: Казань
Сообщений: 6592
Гаджимурадов Рустам
Тут двух блоков не нужно, одного достаточно.

Но так красивше :)
15 мар 20, 14:51    [22099381]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
Kazantsev Alexey
antox
И да, бесит, что нет нормальной конструкции:

Легко заменяется:
try
finally
 if Assigned(ExceptObject()) then;
end;


Не видел такого, подробную
15 мар 20, 15:10    [22099394]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
ъъъъъ
antox
  ibq := TIBSQL.Create(IBDatabase1);
  ibq.Transaction := TIBTransaction.Create(IBDatabase1);

  try
    ibq.SQL.Text := 'delete from table1';
    ibq.ExecQuery;
    ibq.Transaction.Commit;
  finally
    FreeAndNil(ibq);

Зачем вообще при создании объекта задавать владельца, если ты этот объект убиваешь сам?


Что бы обьект коннекшена не задавать, так он сразу сам задаётся
15 мар 20, 15:13    [22099395]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
ъъъъъ
Member

Откуда:
Сообщений: 198
antox
ъъъъъ
пропущено...

Зачем вообще при создании объекта задавать владельца, если ты этот объект убиваешь сам?


Что бы обьект коннекшена не задавать, так он сразу сам задаётся

А зачем вообще объект транзакции на каждый чих создавать? Отчего не создать нужный набор при создании TIBDatabase?
Например, RC/R, RC/W и RR (для отчетов).
15 мар 20, 15:18    [22099400]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
antox
Member

Откуда: РФ
Сообщений: 1097
ъъъъъ
antox
пропущено...


Что бы обьект коннекшена не задавать, так он сразу сам задаётся

А зачем вообще объект транзакции на каждый чих создавать? Отчего не создать нужный набор при создании TIBDatabase?
Например, RC/R, RC/W и RR (для отчетов).


На чтение использую одну транзакцию в приложении, для записи создаю каждый раз + на датасеты по смыслу

А так-то, наверно, можно переделать.

Почему на отчёты отдельная нужна?
15 мар 20, 16:56    [22099433]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
ъъъъъ
Member

Откуда:
Сообщений: 198
antox
Почему на отчёты отдельная нужна?

Не "отдельная", а именно RR.
15 мар 20, 17:54    [22099457]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11598
Гаджимурадов Рустам
Тут двух блоков не нужно, одного достаточно.
Это если мы исключаем возникновение исключения в деструкторе.

ЗЫ. Это провокация :)
16 мар 20, 15:40    [22099980]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61137
_Vasilisk_> ЗЫ. Это провокация :)

Ты там покопался и нашёл что-то или я чего забыл? :)

Posted via ActualForum NNTP Server 1.5

16 мар 20, 15:42    [22099983]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11598
Гаджимурадов Рустам
Ты там покопался и нашёл что-то или я чего забыл? :)
Нет. Я сам пишу код из расчета на то, что почти любая строчка кода может поднять исключение.

А провокация потому, что вспомнился старый тред о том, как относиться к исключениям в деструкторах
16 мар 20, 16:07    [22100006]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Док
Member

Откуда: Казань
Сообщений: 6592
_Vasilisk_
вспомнился старый тред о том, как относиться к исключениям в деструкторах

вы бы не путали неофита. Пусть пишет с лишней обвязкой, пальцы, небось, не сотрутся :)

Сообщение было отредактировано: 16 мар 20, 17:04
16 мар 20, 17:05    [22100055]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61137
Док> Пусть пишет с лишней обвязкой

И всё равно ты неправ. :)

Если бы конструкторов было пять -
плодил бы пять вложенных блоков?

Пальцы не сотрутся, конечно, ни у тебя,
ни у него, но всё же это неправильно. :)
Хотя я это, конечно, зря пишу - помню,
что ты упёртый. :)

Posted via ActualForum NNTP Server 1.5

16 мар 20, 17:16    [22100062]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11598
Гаджимурадов Рустам
Если бы конструкторов было пять - плодил бы пять вложенных блоков?
Вот когда найдем, тогда и будем думать (С).

ЗЫ. А в джаве придумали try-with-resourses. Там синтаксис
try (
  obj1 = new Object1();
  obj2 = new Object2();
  ........
  objN = new ObjectN()
) {
  // Body
}
эквивалентен такому
obj1 = new Object1();
try {
  obj2 = new Object2();
  try {
    ........
    objN = new ObjectN();
    try {
      // Body
    } finally {
      objN.close();
    }
    ..........
  } finally {
    obj2.close();
  }
} finally {
  obj1.close();
}
и исключение в любом месте приводит к корректному выполнению finally блоков
16 мар 20, 18:32    [22100135]     Ответить | Цитировать Сообщить модератору
 Re: Освобождение памяти TIBSQL  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
_Vasilisk_
ЗЫ. А в джаве придумали try-with-resourses.

Так там в любом случае переменные удалятся при выходе за scope. В чем изобретение-то?
В Дельфях тоже можно все объекты в интерфейсный autofree объектик заворачивать. Но, кмк, если взбухает исключение в деструкторе, то случилась довольно серьезная бяка, и на утечку от невыполненного второго тут уже покласть
17 мар 20, 10:49    [22100430]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить