读书人

adoconnection连接数有关问题

发布时间: 2012-03-15 11:50:38 作者: rapoo

adoconnection连接数问题
程序我是用一个adoconnection,所有的查询啊都指向这个连接控件,keepconnection设置为false,这样没有数据集的时候是会在1分钟这样自动关闭连接的,keepconnection不想设置为true,因为一直连住数据库会有一个连接数,这样就有个问题,没有数据集的时候是会自动关闭连接,但是客户查询完后,dbgrid显示数据,然后就一直挂在那里,那也是会占一个连接的,这时是一直保持住数据库连接,直到adoquery.close后,但这样dbgrid也不显示数据了,经过我测试,adoquery.close后,如果adoconnection.keepconnection为true的时候,那么对adoconnection.connected不起任何影响,但是keepconnection为false时,会自动执行adoconnection.connected := false;代码如下
ADOQuery1.Connection := ADOConnection1;
ADOQuery1.Close;
if ADOConnection1.Connected = True then
begin
ShowMessage('yes');
end
else
begin
ShowMessage('no');
end;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('exec t_lb_select :lbid, :lbmc, :sslx');
ADOQuery1.Parameters.ParamByName('lbid').Value := 0;
ADOQuery1.Parameters.ParamByName('lbmc').Value := 'Trim(Edit2.Text)';
ADOQuery1.Parameters.ParamByName('sslx').Value := 0;
ADOQuery1.Prepared;
ADOQuery1.Open;
我的初衷是查询完数据后关闭连接,但是又显示数据,我用perfmon性能工具查看在keepconnection为false时,adoquery.close(相当于执行了adoconnection.connected := false)是在1分钟这样才断开连接的,那么还未断开连接时再次执行adoconnection.connected := true,那么是否使用原来的连接呢,ado本身是有这种机制吗,如果没有的话,那么执行adoconnection.connected := false,为什么连接数是不变的,而要保持了1分钟这样,但是adoconnection被释放掉,或者关闭程序后,那个连接是马上断开了的,如果ado有这种机制,就是connected:=false后还保留原来的连接,那么频繁的设置连接状态true和false会有什么影响吗,我最后的代码如下
try
ADOConnection1.Connected := True;
ADOQuery1.Connection := ADOConnection1;
ADOQuery1.Close;
if ADOConnection1.Connected = True then
begin
ShowMessage('yes');
end
else
begin
ShowMessage('no');
end;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('exec t_lb_select :lbid, :lbmc, :sslx');
ADOQuery1.Parameters.ParamByName('lbid').Value := 0;
ADOQuery1.Parameters.ParamByName('lbmc').Value := 'Trim(Edit2.Text)';
ADOQuery1.Parameters.ParamByName('sslx').Value := 0;
ADOQuery1.Prepared;
ADOQuery1.Open;
finally
ADOQuery1.Connection := nil;
ADOConnection1.Connected := False;
end;
每次执行完查询后都让connected=false,这样连接数问题是解决了,但是如果这样频繁的设置连接状态,是否会是新建新的连接,如果是新建新的连接,那对数据库服务器的负担是很大的,多用户的情况下,如果是创建新的连接,那么用perfmon性能工具查看时为什么设置connnected=false时不立即断开连接,而非要到free或者程序关闭时(既把连接控件给释放掉后)才真正的断开连接呢,求指教,分不多,希望对大家的共同学习有帮助,提前祝大家新年快乐了

[解决办法]
adoconnection的链接断开不是即时的,也就是说ADOConnection1.Connected := False;的时候要等一会才会和数据库真正断开连接,时间不定可能是1~2分,所以当频繁大量创建链接时会出现链接超上限的问题
解决方法1是使用sql存储过程断开所有的sql链接,8过这样的操作肯定会影响其他链接用户
方法2是耐心等待直到超时,不过这两个方法都有很大缺陷,Lz看着选吧
[解决办法]
ADO内部使用连接池,Close后连接不会马上断开
短时间内连接可以重用

读书人网 >.NET

热点推荐