Можно ли использовать один TISC_DB_HANDLE в нескольких потоках

1 view
Skip to first unread message

alex.a...@fashionstudio.ru

unread,
Dec 4, 2013, 8:44:05 AM12/4/13
to ru-fi...@googlegroups.com
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫,

О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫... О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫.

FB2.5 Classic

О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ 1 О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫.
О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ 1 О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ connect/query/disconnect.

О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫: О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ TISC_DB_HANDLE О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫.

function TxServer.GetDBHandle: TISC_DB_HANDLE;
begin
CriticalSectionDB.Enter;
try
dbLoyality.Open; // if closed
ResetDbTimer(dbLoyality);
finally
Result := dbLoyality.Handle;
CriticalSectionDB.Leave;
end;

if not dbLoyality.Connected then
Exception.Create('DB is not opened!');
end;

procedure TxServer.SimpleRequestExecute(...some sql request ...);
var
hCommonConnection: TISC_DB_HANDLE;
begin
aCommonConnection := GetDBHandle();
if aCommonConnection<>nil then
with TpFIBQuery.Create(nil) do
try
Database := TpFIBDatabase.Create(nil);
Database.SQLDialect := 3;
Transaction := TpFIBTransaction.Create(nil);
Database.DefaultTransaction := Transaction;
// ================================
// О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫:
Database.Handle := hCommonConnection;
// ================================
SQL.Text := '...';
ExecQuery;
Transaction.Commit;
finally
FreeAndNil(Transaction.Free);
FreeAndNil(Database.Free);
Free;
end;
end;

О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ TISC_DB_HANDLE...

О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.


Николай Теселько

unread,
Dec 5, 2013, 12:39:49 AM12/5/13
to ru-fi...@googlegroups.com
Тут вопрос к FIB-ам, раньше TFIBDataBase(6.х) вроде не был потоконезависимым.
В вашем случае если приложение настолько простое, то может пользоваться напрямую api драйвера?


4 декабря 2013 г., 17:44 пользователь <alex.a...@fashionstudio.ru> написал:
Привет всем,

Заранее прошу извинить, если этот вопрос уже обсуждался... я долго не
появлялся тут.

FB2.5 Classic

Есть многопоточный сетевой сервис, который делает 1 короткий запрос к БД.
Не хочется в классике на 1 запрос создавать новое connect/query/disconnect.

Хочется примерно так: передавать TISC_DB_HANDLE на единый центральный
коннект.
   // вот хочется так:

   Database.Handle := hCommonConnection;
   // ================================
   SQL.Text := '...';
   ExecQuery;
   Transaction.Commit;
 finally
   FreeAndNil(Transaction.Free);
   FreeAndNil(Database.Free);
   Free;
 end;
end;

Смущает только, не удивится ли сервер, если с ним будет работать несколько
потоков на одном TISC_DB_HANDLE...

Заранее спасибо.


--

--- Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.

Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес ru-firebird...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

Reply all
Reply to author
Forward
0 new messages