Возник следующий вопрос. Написал приложение использующее самописный пул запросов к БД PostgreSQL. Все в общем работает, есть одно небольшое но: если соединение "падает", например закрыто сервером по таймауту, и в этот момент была открыта транзакция при попытке "Destroy" начинается ругань на " Operation cannot be performed on an active transaction".
Попробовал сделать так
Код: Выделить всё
/// деструктор
destructor TPgConnection.Destroy;
begin
// "прибиваем" транзакцию
if Assigned(fSQLTransaction) then
begin
try
if fSQLTransaction.Active then
fSQLTransaction.Rollback;
except
on E: Exception do
begin
LogToFile('CONN_DESTRUCTOR', Format('Ignoring exception during transaction rollback on destroy: %s', [E.Message]), Warning);
end;
end;
fSQLTransaction.DataBase := nil;
end;
// "прибиваем" соединение
if Assigned(fPQConnection) then
begin
try
if fPQConnection.Connected then
fPQConnection.Connected := False;
except
on E: Exception do
begin
LogToFile('CONN_DESTRUCTOR', Format('Ignoring exception during connection on destroy: %s', [E.Message]), Warning);
end;
end;
end;
try
LogToFile('CONN_DESTRUCTOR', Format('Destroing connection %s', [GUIDToString(Guid)]), Info);
fSQLTransaction.Free;
fPQConnection.Free;
LogToFile('CONN_DESTRUCTOR', Format('Destroy connection %s', [GUIDToString(Guid)]), Info);
except
on E: Exception do
begin
LogToFile('CONN_DESTRUCTOR', Format('Exception during free component on destroy connection %s: %s', [GUIDToString(Guid), E.Message]), Warning);
end;
end;
inherited Destroy;
end;
Оно как бы и нечего, но как-то неаккуратненько
