Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Освобождение памяти TIBSQL / 25 сообщений из 30, страница 1 из 2
15.03.2020, 11:29
    #39937526
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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 или его надо отдельно удалять?
...
Рейтинг: 0 / 0
15.03.2020, 11:41
    #39937527
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
antox

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

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

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


Тогда транзакция будет освобождена вместе с ibq.
...
Рейтинг: 0 / 0
15.03.2020, 11:54
    #39937529
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Polesov
antox

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

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

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


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


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

Код: pascal
1.
ibq.Transaction.DefaultDatabase := ibq.Database;
...
Рейтинг: 0 / 0
15.03.2020, 13:25
    #39937553
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
antox
Будет ли удален ibq.Transaction := TIBTransaction или его надо отдельно удалять?

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

зы. прокладки try..filnally/try..except не просто так придуманы:)
...
Рейтинг: 0 / 0
15.03.2020, 13:31
    #39937555
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Док,

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

И да, бесит, что нет нормальной конструкции:
Код: sql
1.
2.
3.
4.
5.
6.
7.
Try

Except

Finally

End
...
Рейтинг: 0 / 0
15.03.2020, 13:44
    #39937558
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
antox
И да, бесит, что нет нормальной конструкции:

Легко заменяется:
Код: pascal
1.
2.
3.
4.
try
finally
 if Assigned(ExceptObject()) then;
end;
...
Рейтинг: 0 / 0
15.03.2020, 13:47
    #39937559
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
antox> А при каком условии создание транзакции может завершиться ошибкой?

Наверняка, при проблемах с соединением (потеря связи, закрытие соединения со стороны сервера).
В случае эксепшена в триггере на старт транзакции - тоже, наверное (не помню уже, лень проверять).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.03.2020, 14:00
    #39937564
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
antox
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  ibq := TIBSQL.Create(IBDatabase1);
  ibq.Transaction := TIBTransaction.Create(IBDatabase1);

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


Зачем вообще при создании объекта задавать владельца, если ты этот объект убиваешь сам?
...
Рейтинг: 0 / 0
15.03.2020, 14:23
    #39937572
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
antox
А при каком условии создание транзакции может завершиться ошибкой?

Если брать шире, то неважно, при каких условиях. Важна методология. В любой классической книжке по Паскалю об этом говорится, когда описывается создание объектов и обработки исключительных ситуаций. Так что, в твоем случае можно написать как-то:
Код: 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.
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;
...
Рейтинг: 0 / 0
15.03.2020, 14:29
    #39937577
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Гаджимурадов Рустам
antox> А при каком условии создание транзакции может завершиться ошибкой?

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

Не, ошибок не будет, ничего не будет, пока с транзакцией работать не начнёшь. Это ведь всего лишь оболочка, экземпляр класса.
...
Рейтинг: 0 / 0
15.03.2020, 14:34
    #39937581
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Док
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  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
...
Рейтинг: 0 / 0
15.03.2020, 14:35
    #39937582
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
ъъъъъ> Не, ошибок не будет, ничего не будет, пока с транзакцией работать не начнёшь.

Да, это я в вопрос не вник, я про старт говорил. Сорри, короче.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.03.2020, 14:51
    #39937592
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Гаджимурадов Рустам
Тут двух блоков не нужно, одного достаточно.

Но так красивше :)
...
Рейтинг: 0 / 0
15.03.2020, 15:10
    #39937595
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Kazantsev Alexey
antox
И да, бесит, что нет нормальной конструкции:

Легко заменяется:
Код: pascal
1.
2.
3.
4.
try
finally
 if Assigned(ExceptObject()) then;
end;



Не видел такого, подробную
...
Рейтинг: 0 / 0
15.03.2020, 15:13
    #39937596
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
ъъъъъ
antox
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  ibq := TIBSQL.Create(IBDatabase1);
  ibq.Transaction := TIBTransaction.Create(IBDatabase1);

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


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


Что бы обьект коннекшена не задавать, так он сразу сам задаётся
...
Рейтинг: 0 / 0
15.03.2020, 15:18
    #39937597
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
antox
ъъъъъ
пропущено...

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


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

А зачем вообще объект транзакции на каждый чих создавать? Отчего не создать нужный набор при создании TIBDatabase?
Например, RC/R, RC/W и RR (для отчетов).
...
Рейтинг: 0 / 0
15.03.2020, 16:56
    #39937615
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
ъъъъъ
antox
пропущено...


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

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


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

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

Почему на отчёты отдельная нужна?
...
Рейтинг: 0 / 0
15.03.2020, 17:54
    #39937620
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
antox
Почему на отчёты отдельная нужна?

Не "отдельная", а именно RR.
...
Рейтинг: 0 / 0
16.03.2020, 15:40
    #39937867
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Гаджимурадов Рустам
Тут двух блоков не нужно, одного достаточно.
Это если мы исключаем возникновение исключения в деструкторе.

ЗЫ. Это провокация :)
...
Рейтинг: 0 / 0
16.03.2020, 15:42
    #39937869
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
_Vasilisk_> ЗЫ. Это провокация :)

Ты там покопался и нашёл что-то или я чего забыл? :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.03.2020, 16:07
    #39937885
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Гаджимурадов Рустам
Ты там покопался и нашёл что-то или я чего забыл? :)
Нет. Я сам пишу код из расчета на то, что почти любая строчка кода может поднять исключение.

А провокация потому, что вспомнился старый тред о том, как относиться к исключениям в деструкторах
...
Рейтинг: 0 / 0
16.03.2020, 17:05
    #39937918
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
_Vasilisk_
вспомнился старый тред о том, как относиться к исключениям в деструкторах

вы бы не путали неофита. Пусть пишет с лишней обвязкой, пальцы, небось, не сотрутся :)
...
Рейтинг: 0 / 0
16.03.2020, 17:16
    #39937922
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Док> Пусть пишет с лишней обвязкой

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

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

Пальцы не сотрутся, конечно, ни у тебя,
ни у него, но всё же это неправильно. :)
Хотя я это, конечно, зря пишу - помню,
что ты упёртый. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.03.2020, 18:32
    #39937970
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
Гаджимурадов Рустам
Если бы конструкторов было пять - плодил бы пять вложенных блоков?
Вот когда найдем, тогда и будем думать (С).

ЗЫ. А в джаве придумали try-with-resourses. Там синтаксис
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
try (
  obj1 = new Object1();
  obj2 = new Object2();
  ........
  objN = new ObjectN()
) {
  // Body
}

эквивалентен такому
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
obj1 = new Object1();
try {
  obj2 = new Object2();
  try {
    ........
    objN = new ObjectN();
    try {
      // Body
    } finally {
      objN.close();
    }
    ..........
  } finally {
    obj2.close();
  }
} finally {
  obj1.close();
}

и исключение в любом месте приводит к корректному выполнению finally блоков
...
Рейтинг: 0 / 0
17.03.2020, 10:49
    #39938132
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TIBSQL
_Vasilisk_
ЗЫ. А в джаве придумали try-with-resourses.

Так там в любом случае переменные удалятся при выходе за scope. В чем изобретение-то?
В Дельфях тоже можно все объекты в интерфейсный autofree объектик заворачивать. Но, кмк, если взбухает исключение в деструкторе, то случилась довольно серьезная бяка, и на утечку от невыполненного второго тут уже покласть
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Освобождение памяти TIBSQL / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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