Additional
dbCAP
AnyDAC
ThinDAC
NCOCI8
Topic: Многопоточная работа с TADConnection
Многопоточная работа с TADConnection
Posted: 2008/05/26 01:53
 
Имеется основной поток исполнения:
- в нем открывается коннекшн(odbc, sybase)
- Connection.StartTransaction

Набор запросов
begin
Отдельным потоком: вставка в темповую таблицу 1
Ожидаем поток
Отдельным потоком: вставка в темповую таблицу 2
Ожидаем поток
Запрашиваем отдельным потоком 'select count(*) from "темповая таблица 1"'
!!!! и тут оказывается, что Count = 0
end;

- Connection.Commit

Насколько я правильно это делаю?
как влияет исполнение в разных потоках? из-за этого получается эффект отдельной сессии?
Re:Многопоточная работа с TADConnection
Posted: 2008/05/26 03:21
 
1) Используется только один TADConnection ? Он не пересоединяется с БД в проессе работы кода ?
2) Отдельным потоком: вставка в темповую таблицу 1
Ожидаем поток
Отдельным потоком: вставка в темповую таблицу 2
Ожидаем поток
Зачем делать отдельным потоком и его ожидать ? Не проще ли все сделать в одном потоке ?
3) как влияет исполнение в разных потоках? из-за этого получается эффект отдельной сессии?Одно соединение в AnyDAC в каждый момент времени должно использоваться только одним потоком. А да бы не думалось - одно соединение на один поток. Иначе - прямой путь к AV и прочим проблемам.
"Эффект отдельной сессии" получить при помощи одного TADConnection не вижу как ... Либо не происходит вставка в таблицу, либо из нее что-то удаляет данные, либо происходит rollback, либо происходит пересоединение с БД.
Re:Многопоточная работа с TADConnection
Posted: 2008/05/26 03:44
 
отдельным потоком делается потому что:
1. сподручнее убивать
2. можно мониторить таймаут отдельного запроса
3. можно мониторить необходимоть замочить выполнение(отсоединился клиент, программу останавливают, останавливают tcpip сервер)

и коннекшн в данный момент используется только одним потоком
существует вообще пул коннекшенов

проанализировал сейчас код... тестировал и оказалось что обертка:
работает ен так как оракл..и не делает сейвпоинтов
изза этого коммит всё сбрасывает... вот так вот

Connection.StartTransaction;
.....
.....

Connection.StartTransaction;
try
Query.ExecSQL;
Connection.Commit;
except
Connection.Rollback;
raise;
end;

...
...
Connection.Commit;
Re:Многопоточная работа с TADConnection
Posted: 2008/05/26 20:38
 
не делает сейвпоинтов
Sybase SQL Anywhere драйвер делает сейвпоинты.
По крайней мере тесты на вложенные транзакции проходят.