我正在处理所有使用多线程访问sql server 2005 db的应用程序,我目前通过设置TADOQuery对象的连接字符串属性使用隐式连接,但这似乎打开了很多连接到数据库。我们需要减少单个实例保持打开的连接数,所以
我会感激任何意见或想法..
非常感谢答案 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
当客户端应用程序使用应用程序角色时,它非常有用。