Quantcast

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

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

alex.abramov
Привет всем,

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

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...

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


--

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

Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

Николай Теселько
Тут вопрос к FIB-ам, раньше TFIBDataBase(6.х) вроде не был потоконезависимым.
В вашем случае если приложение настолько простое, то может пользоваться напрямую api драйвера?


4 декабря 2013 г., 17:44 пользователь <[hidden email]> написал:
Привет всем,

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

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...

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


--

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

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

--
 
---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Loading...