TADoConnection和池

时间:2009-05-18 15:48:49

标签: delphi

我正在处理所有使用多线程访问sql server 2005 db的应用程序,我目前通过设置TADOQuery对象的连接字符串属性使用隐式连接,但这似乎打开了很多连接到数据库。我们需要减少单个实例保持打开的连接数,所以

  1. tadoconnection库中是否有任何类型的连接池,如何启用它并设置限制。
  2. 如果没有,那么建议的方法是减少和重用与数据库的连接,以便应用程序可以很好地扩展。
  3. 我会感激任何意见或想法..

    非常感谢

4 个答案:

答案 0 :(得分:4)

增加连接数的另一个原因是在同一连接上有多个打开的查询。

假设你有像

这样的代码
db := TAdoConnection.Create()
qry1 := TAdoQuery.Create();
qry2 := TAdoQuery.Create();

qry1.connection := db;
qry2.connection := db;

qry1.SQL.Text := 'select * from whatever';

qry1.open;
while not qry1.eof do
begin
  x := qry1.fieldbyname('fld').AsString;
  qry2.SQL.Text := 'select * from elsewhere where SomeField='+ QuotedStr(x);
  qry2.Open;
  ..do something..
  qry2.Close;

  qry1.Next;
end;

qry2.Open()将导致另一个连接被创建,它没有被合并

如果您有这样的代码,请将qry1的结果存储到本地,然后执行qry2的工作。在这种情况下,您将只维护一个连接。

粗略地说,这看起来更像是:

db := TAdoConnection.Create()
qry1 := TAdoQuery.Create();
qry2 := TAdoQuery.Create();
str := TStringList.Create();

qry1.connection := db;
qry2.connection := db;

qry1.SQL.Text := 'select * from whatever';

qry1.open;
while not qry1.eof do
begin
  x := qry1.fieldbyname('fld').AsString;
  str.Add(x);
  qry1.Next;
end;
qry1.Close;

for i := 0 to str.Count-1 do
begin
  qry2.SQL.Text := 'select * from elsewhere where SomeField='+ QuotedStr(str[i]);
  qry2.Open;
  ..do something..
  qry2.Close;
end

答案 1 :(得分:3)

默认情况下,与SQL Server的ADO数据库连接汇集在一起​​,您无需任何工作。您的连接字符串可以更改池化行为。你的连接字符串是什么样的?

保持连接字符串完全相同,并在线程中创建/释放ADO连接,让ADO运行时处理池。每个进程的连接数通常等于“最近”同时连接的最大数量加上一些缓冲区。

答案 2 :(得分:1)

在DataModule上设置TADOConnection组件并使用数据模块上所有其他ADO组件的组件应该已经减少了很多连接。 如果应用程序使用大量数据模块,则可以使这些数据模块在运行时共享相同的连接。

答案 3 :(得分:1)

Microsoft说:“...禁用OLE DB资源池,默认情况下ADO使用...您可以通过将”OLE DB Services = -2“添加到ADO连接字符串”。

以下是链接:http://support.microsoft.com/kb/229564

当客户端应用程序使用应用程序角色时,它非常有用。