sezavasasilov
@sezavasasilov

Как организовать работу с БД FireBird из нескольких потоков?

Копаю в сторону TIBConnectionbroker, но не могу понять как правильно организовать работу. Приложение консольное.
Приведу несколько строк из кода.

Само приложение:
program main;

{$APPTYPE CONSOLE}

uses
  IBX.IBConnectionBroker,
  MyThread in 'MyThread.pas';

var
  Thread1, Thread2: TMyThread;
  ConnectionBroker: TIBConnectionBroker;

begin
  ConnectionBroker:=TIBConnectionBroker.Create(nil);
  ConnectionBroker.DatabaseName:='C:\DataBase.fdb';
  ConnectionBroker.Params.Clear;
  ConnectionBroker.Params.Add('user_name=SYSDBA');
  ConnectionBroker.Params.Add('password=masterkey');

  Thread1:=TMyThread.Create(True);
  Thread1.fBroker:=ConnectionBroker;
  Thread1.Resume;

  Thread2:=TMyThread.Create(True);
  Thread2.fBroker:=ConnectionBroker;
  Thread2.Resume;
end;


Модуль потока:
unite MyThread;

interface

uses
  IBDatabase,
  IBCustomDataSet,
  IBX.IBConnectionBroker;

type
  TMyThread = class(TThread)
  private
    fDataBase: TIBDatabase;
    fTransaction: TIBTransaction;
    fDataSet: TIBDataSet;
  protected
    procedure Execute; override;
  published
    fBroker: TIBConnectionBroker;
  end;

implementation

procedure TMyThread.Execute;
begin
  fDatabase:=fBroker.GetConnection; // Тут вылетает Exception class $C0000005 with message 'access violation at 0x0069dc06: read of address 0x00000000'
  
  fTransaction:=TIBTransaction.Create(nil);
  fTransaction.DefaultDatabase:=fDataBase;

  fDataSet:=TIBDataSet.Create(nil);
  fDataSet.Database:=fDataBase;
  fDataSet.Transaction:=fTransaction;
end;


Сам понять это не в силах. Надеюсь на общественный интеллект.
  • Вопрос задан
  • 832 просмотра
Решения вопроса 1
sezavasasilov
@sezavasasilov Автор вопроса
Я нашел в чем дело.
После создания и задания параметров TIBConnectionBroker надо было его инициализировать.
Что в итоге получилось:
ConnectionBroker:=TIBConnectionBroker.Create(nil);
ConnectionBroker.DatabaseName:='C:\DataBase.fdb';
ConnectionBroker.Params.Clear;
ConnectionBroker.Params.Add('user_name=SYSDBA');
ConnectionBroker.Params.Add('password=masterkey');
ConnectionBroker.Init; //   <- Вот он, мой геморрой

Все остальное остается как было.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы