Delphi 2010:UniDAC与Indy-MultiThread安全处理方法

时间:2016-01-05 16:16:57

标签: mysql multithreading delphi-2010 indy10 unidac

我正在开发基于Indy的应用程序。 Server有几个Indy TCP Server组件。 所以它在多线程下工作并处理mysql db。 我遇到了一个问题。 这是关于线程中MySQL DB的例外情况。 当几个线程攻击同一个db表时,它就像我说的那样

UniQuery_Mgr: Duplicate field name 'id'
UniQuery_Mgr: Field 'grp_id' not found //of course grp_id field is really existed.
Assertion failure (C:\Program Files (x86)\unidac539src\Source\CRVio.pas, line 255)
Commands out of sync;  You can't run this command now
ReceiveHeader: Net packets out of order: received[0], expected[1]
UniQuery_Mgr: Cannot perform this operation on a closed dataset

怎么办? UniQuery_Mgr是TUniQuery组件。 我的查询处理代码通常是这样的

代码1

  sql := 'SELECT * FROM data_writed;';//for example
  UniQuery_Mgr.SQL.Clear;
  UniQuery_Mgr.SQL.Add(sql);
  UniQuery_Mgr.ExecSQL;

代码2

  try
    sql := 'SELECT * FROM gamegrp_mgr;';
    UniQuery_Mgr.SQL.Clear;
    UniQuery_Mgr.SQL.Add(sql);
    UniQuery_Mgr.ExecSQL;

    if UniQuery_Mgr.RecordCount > 0 then
    begin
      MAX_GAME_GROUP_COUNT := UniQuery_Mgr.RecordCount + 1;

      UniQuery_Mgr.First;
      i := 1;
      while not UniQuery_Mgr.Eof do
      begin
        Game_Group_ID[i] := UniQuery_Mgr.FieldByName('grp_id').AsInteger;
        Game_Game_ID[i] := UniQuery_Mgr.FieldByName('game_id').AsInteger;
        UniQuery_Mgr.Next;
        Inc(i);
      end;
    end;
  except
    on E : Exception do
    begin
      EGAMEMSG := Format('GAME group read error: <%s> @ %s',[ E.ToString, DateTimeToStr(now)]);
      Exit;
    end;
  end;

代码3

  try
    sql := 'UPDATE data_writed SET write_gamegrp = ' + QuotedStr('0') + ';';
    UniQuery_Mgr.SQL.Clear;
    UniQuery_Mgr.SQL.Add(sql);
    UniQuery_Mgr.ExecSQL;
  except
    on E : Exception do
    begin
      EGAMEMSG := Format('data updating error: <%s> @ %s',[ E.ToString, DateTimeToStr(now)]);
      Exit;
    end;
  end;

我处理数据库组件不好?其他线程安全方法是否存在???

0 个答案:

没有答案