自己写了一个库房管理系统,连接数据库用的都是ADOQuery,今天用SQL查询分析其执行exec sp_who   发现连接数好多啊,就我一个系统,进程就1000个!!  我猜可能是我写程序的原因
因为delphi里ADOQuery连接都是这样写的
先 close
然后 sql.clear sql.add
然后Open 估计连接数过多就是因为open以后没有close吧
但是刚才我open以后全部close了 ,sql连接进程还是那么多没变呀?请问高手这怎么回事啊?我应该怎么做才能减少连接数,提高数据库执行效率呢?

解决方案 »

  1.   


    adoQuery的 connection 你是怎么写的?
      

  2.   

    Provider=SQLOLEDB.1;Password=xxxxx;Persist Security Info=True;User ID=kbs;Initial Catalog=WMS;Data Source=192.168.158.22;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=userid;Use Encryption for Data=False;Tag with column collation when possible=False
      

  3.   

    我是新建了一个data module 然后里面放了adoconnection ,它的connectionstring就是Provider=SQLOLEDB.1;Password=xxxxx;Persist Security Info=True;User ID=kbs;Initial Catalog=WMS;Data Source=192.168.158.22;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=userid;Use Encryption for Data=False;Tag with column collation when possible=False
      

  4.   

    adoconnection 是只被链连接了一次,还是被循环连接了呢
      

  5.   

    ADOQuery连接data module 的adoconnection ,连接数据库。
      

  6.   


    Use Procedure for Prepare=1
    //改下
    Use Procedure for Prepare=0
      

  7.   

    你的意思是不同的ADOQuery连接同一个adoconnection?   嗯 ,是的  但是要是把adoconnection关了,我所有模块的ADOQuery就都不能用了啊,因为是有好多用户同事使用的,我不能把adoconnection关了呀。
      

  8.   

    不对,应该说是关闭了adoconnection 程序所有模块,凡是连接数据库的,都不能连接数据库了
      

  9.   

    这可能和你的adoquery的Prepared属性有对应,你adoquery的Prepared设置为什么
      

  10.   

    是False啊    这是什么属性啊 代表了什么
      

  11.   

    Orz  Orz  Orz  Orz  Orz  Orz  Orz  Orz  Orz  
      

  12.   

    丟,,,,,你用一個ADOConnection 不就行了, ADOQuery全部連接ADOConnection 每個ADOQuery你都去連接,不死才怪。
      

  13.   


    我就是所有ADOQuery都连接一个adoconnection的啊,所以不能关单个呀
      

  14.   

    整个工程就一个adoconnection控件,所有adoquery都连它
      

  15.   

     
    是我讲的不清楚么,我工程里就一个adoconnection啊,就是1个adoconnection对应N个adoquery  也就是一个sql连接对应N个sql线程。
    我的目的是:close一个adoquery,让数据库的线程少掉一个以提高效率,并不是结束这个sql连接,也就是adoconnection。问题就是close adoquery没有用,线程仍然存在想请教高手该如何结束这个线程,而不影响连接其他adoconnection的adoquery。
    应该够明白了吧。。
      

  16.   

    说错了 是“不影响连接adoconnection的其他adoquery  不好意思”
      

  17.   

    不是是每个adoquery都用了一个adoconnection吧?
      

  18.   

    exec sp_who 得到的不是连接数,是处理进程,只要没有锁死的是就没影响,反而是提升数据库执行效率的
      

  19.   


    嗯  对呀,得到的是处理进程  但是我们公司用的软件很多啊,我的程序只要一打开就1000个进程,要知道sql服务器就一台啊,我想把没用的处理进程结束了,你知道怎么弄吗
      

  20.   

    SELECT * FROM
    [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT 
       [DBID]
    FROM 
       [Master].[dbo].[SYSDATABASES]
    WHERE 
       NAME='数据库名'
    )
    blocked字段的值为0就表示没有阻塞,
    waitresource字段的值为空就没问题,否则就是存在资源竞争,通过SPID查看执行的SQL语句,可能需要优化
      

  21.   

    再把adoquery连接一个内存表控件,通过内存表来显示,然后再关闭adoquery,这样可行吗?
      

  22.   

    用一个adoconnect,然后其他的adoquery就直接和这个adoconnect连接
      

  23.   

     试验过好多,目前只有ADOQuery.Destroy才能结束掉sql线程。
      

  24.   

    不知道你的程序架构是什么样的!
    最好是创建连接池,把各个客户端的SQL请求发送到应用层进行排队。
      

  25.   

    本帖最后由 liangpei2008 于 2010-09-08 08:27:32 编辑
      

  26.   

    建議使用連接池...
    PS:一個adoconnect,然後其他的adoquery就直接和這個adoconnect連接...
      

  27.   


    我就是adoquery全部连在一个adoconection中的,  adoconection就叫连接池吗?。我去百度一下。。囧rz
      

  28.   

    本帖最后由 ptwhite 于 2010-09-16 17:00:28 编辑
      

  29.   

    Prepare 表示在 SQL Server 里开一个实例维护你的这个请求。
    如果下次有相同的,则直接用这个实例。
    而不是重新再创建一个。
    (好像是这样一个意思)
    应用上,如果是很频繁的调用同一句 sql , 那么 Prepare 绝对有帮助。
      

  30.   

    整个工程就一个adoconnection控件,所有adoquery都连它。于是楼主的问题解决。
      

  31.   

    var
         ADOConnection1:TADOConnection;
         adoquery1,adoquery2:Tadoquery;
    begin
            try
                    try
                           adoconnection1:=Tadoconnection.Create(Self);
                           adoconnection1.LoginPrompt:=false;
                           adoconnection1.KeepConnection:=false;
                           ADOConnection1.ConnectionString:=connectStr;
                           adoconnection1.Open;                       ADOQuery1:=TADOquery.Create(self);
                           ADOQuery1.Connection:=Adoconnection1;                       ADOQuery2:=TADOquery.Create(self);
                           ADOQuery2.Connection:=Adoconnection1;                       adoconnection1.BeginTrans;                       //删除进货明细表
                           adoquery1.Close;
                           adoquery1.sql.clear;
                           adoquery1.sql.add('delete from jhmxb where id=:id');
                           adoquery1.Parameters.ParamByName('id').Value:=Trim(Edit22.Text);
                           adoquery1.Prepared;
                           adoquery1.ExecSQL;                       //修改进货汇总表
                           adoquery1.Close;
                           adoquery1.sql.clear;
                           adoquery1.sql.add('update jhhzb set jhje=jhje-:jhje,wfje=wfje-:wfje where djh=:djh');
                           adoquery1.Parameters.ParamByName('jhje').Value:=trim(edit18.Text);
                           adoquery1.Parameters.ParamByName('wfje').Value:=trim(edit18.Text);
                           adoquery1.Parameters.ParamByName('djh').Value:=trim(edit1.Text);
                           adoquery1.Prepared;
                           adoquery1.ExecSQL;
                           
                           //明细表是否删除完毕
                           adoquery2.Close;
                           adoquery2.sql.clear;
                           adoquery2.sql.add('select * from jhmxb where djh=:djh');
                           adoquery2.Parameters.ParamByName('djh').Value:=trim(edit1.Text);
                           adoquery2.Prepared;
                           adoquery2.open;
                           if adoquery2.RecordCount=0 then
                           begin
                                 adoquery1.Close;
                                 adoquery1.sql.clear;
                                 adoquery1.sql.add('delete from jhhzb where djh=:djh');
                                 adoquery1.Parameters.ParamByName('djh').Value:=trim(edit1.Text);
                                 adoquery1.Prepared;
                                 adoquery1.ExecSQL;
                           end;                       //库存明细表
                           adoquery1.close;
                           adoquery1.sql.clear;
                           adoquery1.sql.add('update kcb set jhs=jhs-:jhs,kcs=kcs-:kcs where mc=:mc and jj=:jj');
                           adoquery1.Parameters.ParamByName('jhs').Value:=Trim(Edit21.Text);
                           adoquery1.Parameters.ParamByName('kcs').Value:=Trim(Edit21.Text);
                           adoquery1.Parameters.ParamByName('mc').Value:=Trim(Edit15.Text);
                           adoquery1.Parameters.ParamByName('jj').Value:=Trim(Edit20.Text);
                           adoquery1.Prepared;
                           adoquery1.ExecSQL;                       adoquery1.close;
                           adoquery1.sql.clear;
                           adoquery1.sql.add('update kcb set jhje=jhs*jj,kcje=kcs*jj where mc=:mc and jj=:jj');
                           adoquery1.Parameters.ParamByName('mc').Value:=Trim(Edit15.Text);
                           adoquery1.Parameters.ParamByName('jj').Value:=Trim(Edit20.Text);
                           adoquery1.Prepared;
                           adoquery1.ExecSQL;
                           
                           adoconnection1.CommitTrans;
                    except
                          adoconnection1.RollbackTrans;
                          application.MessageBox('当前信息资料保存失败请确定之后重新再试','提示',mb_ok+mb_iconstop);
                    end;
            finally
                    jhmxb.ADOquery1.Close;
                    ADOQuery1.Close;
                    ADOQuery1.Free;
                    ADOQuery2.Close;
                    ADOQuery2.Free;
                    adoconnection1.Close;
                    adoconnection1.Free;
                    Self.Close;
            end;
      

  32.   

    你的ADOQuery静态属性 的active 是不是 true  改成 fault 就行了   
    你的CLOSE只是关掉了数据集。
    ADOQuery.active:=fault;
      

  33.   

    我想问一下,我用完ADOQUERY后,FREE一下,这样行不行?