Delphi 2010:没有线程与线程 - TSQLConnection和TSQLDataSet

时间:2010-09-07 04:24:26

标签: multithreading delphi

My previous question

从上面的答案来看,意味着如果我的线程中有创建对象,我将面临内存分配/解除分配的瓶颈?

我有一个案例,我需要创建TSQLConnection和TSQLDataSet来查询数据库的5个表中的数据,每个表有超过10000条记录。所以我将创建5个线程,每个线程通过构造函数接受一个tablename作为参数。不幸的是,我无法获得更明显的时间差异。我写了以下代码:


TMyThread = class(TThread)
private
  FTableName: string;
protected
  procedure Execute; override;
public
  constructor Create(const CreateSuspended: Boolean; const aTableName: string); 
    reintroduce; overload;
end;

constructor TMyThread.Create(const CreateSuspended: Boolean; const aTableName);
begin
  inherited Create(CreateSuspended);
  FTableName := aTableName;
  FreeOnTerminate := True;
end;

procedure TMyThread.Execute;
var C: TSQLConnection;
    D: TDataSet;
begin
  C := NewSQLConnection;
  try
    D := NewSQLDataSet(C, FTableName);
    try
      D.Open;
      while not D.Eof do begin
        // Do something
        D.Next;
      end;
    finally
      D.Free;
    end;
  finally
    C.Free;
  end;
end;

function NewSQLConnection: TSQLConnection;
begin
  Result := TSQLConnection.Create(nil);

  // Setup TSQLConnection
end;

function NewSQLDataSet(const aConn: TSQLConnection; const aTableName: string):
    TSQLDataSet;
begin
  Result := TSQLDataSet.Create(aConn);
  Result.CommandText := Format('SELECT * FROM %s', [aTableName]);
  Result.SQLConnection := aConn;
end;

对此案件有任何建议或建议吗?

3 个答案:

答案 0 :(得分:2)

我应该做的第一件事:看看CPU时间。瓶颈在哪里:您的应用程序是在单用户模式下使用100%CPU,然后多线程将无法工作(仅在双/四核上)。但是,如果你的多线程模式的应用程序没有使用太多的CPU,你可能会遇到另一个瓶颈:例如,数据库服务器可能使用100%的CPU?或者你的服务器HD很慢?还是慢网?或者甚至DBExpress数据库驱动程序也不是多线程的,所以它一次只使用1个线程(你会注意到多核上客户端和服务器上的CPU很低)。

顺便说一下:是的,你应该总是尽量减少内存分配。对于繁重的多线程,FastMM不是最好的MM:在多核上不能很好地扩展(你将从不在内存繁重的应用程序中看到100%的CPU)。但在普通的应用程序中没有什么可担心的。只有在这种情况下,你可以尝试使用TopMM:稍微慢一点(?)但是要更好地扩展: http://www.topsoftwaresite.nl/Downloads/TopMemory.pdf

答案 1 :(得分:1)

啊哈!你说你使用SuperServer?

  

Firebird 1.5 Classic Server vs. Superserver
  的SuperServer:   没有SMP支持。在多处理器Windows机器上,当操作系统在CPU之间切换进程时,性能甚至会急剧下降。要防止这种情况,请在配置文件firebird.conf中设置CpuAffinityMask参数。

所以它只使用1个核心。您应该使用Classic Server(每个连接的进程)。 Firebird还没有真正的SMP支持,将在3.0版本中: http://tracker.firebirdsql.org/browse/CORE-775

答案 2 :(得分:0)

实际上我想在Process Explorer中看到一个CPU GRAPH ,就像本页的第4步: http://www.brightrev.com/how-to/windows/53-five-uses-for-sysinternals-process-explorer.html

因为它及时显示CPU + mem + IO(!)。请测试应用程序和firebird。

我认为firebird受IO(你的HD)的约束,因为在你的第一个CPU截图中,两者都有低CPU。也许你可以增加firebird内存缓存?

顺便说一下:你有多少核心/ CPU?