RT 
像这样的代码:
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add( ‘select * from table’ );
    ADOQuery1.Open;程序运行后ADOQuery1不是会一直处于连接状态嘛?那不是很占SQL的资源啊?连接数太多会影响SQL效率的啊!应该怎么解决这个问题呢?!

解决方案 »

  1.   

    尽量重复使用adoquery,避免创建过多的实例,没用的就关掉
      

  2.   


    尽量重复使用adoquery,这一点以后会注意了。
    避免创建过多的实例,没用的就关掉,就是这一点不好弄啊,我close以后,连接还是存在呢 为什么啊
      

  3.   

    adoq1.close只是close打開的數據表,不會close database的連接
      

  4.   


    哦 知道了 那怎么close database连接线程呢?
      

  5.   

    用一个AdoConnection组件,所有的AdoQuery的Connection属性指定这个AdoConnection组件就可以了,这样你不管多少个AdoQuery,不管是开着还是关着,都只占一个数据库连接
      

  6.   

    close database那就得关掉adoconnection了
      

  7.   


    那我还有其他的ADOquery连接这个adoconnection呢怎么办?close database后 其他ADOQuery也不能用了呀  还有其他办法吗
      

  8.   


    那我还有其他的ADOquery连接这个adoconnection呢怎么办?close database后 其他ADOQuery也不能用了呀 还有其他办法吗是你不了解adoconnection组件的用法,N个ADOquery中的一个Close后,只要你不对adoconnection进行强制的Close,对其它的ADOquery使用并没有影响,做试验验证,不要想当然
      

  9.   

    ADOquery重复Close和Open不会释放内存,需要Free的时候才释放内存,因此重复Open的时候,注意一下内存的使用。
      

  10.   


    我想当然了? 我都是自己做了试验的,adoquery close并没有用,确实对其他没有影响,但是连接线程仍然存在,我目的要结束线程
      

  11.   

    结束线程,并不是结束sql连接,一个sql连接包含很多个线程的。1对N的关系!
      

  12.   

    看了你发的另外一个帖子,你说的线程指的是Sql Server的处理线程对吧
    只要没有锁死的就没有影响,实在要去掉你只有手动去Kill,如果你用到了存储过程,里面用到了游标之类的东西记得用完释放就成
      

  13.   

    其实连接对于SQL服务器不算什么,而是执行SQL语句才会占用服务器资源.如果我们使用OPEN后.传回来的数据是放到内存中.而连接只是建立而已.SQL服务器这个时候是处于空闲状态.所以楼主不要担心.
      

  14.   

    楼上2位说的都不错,但我是看见服务器上90%以上都是我的程序占的线程,所以有点担心。是不是只有delphi编的才会出现这样的情况? 我同事们用vb写的都不占的呀。
      

  15.   

    连接建立后,SQL服务器的这些线程是处于sleeping状态的,这是空闲吗?
      

  16.   

    线程的Sleep状态,就是挂起线程。 你可以在主线程中Sleep(100000)来试试是什么样。而Query, 重复使用即可。 Close 虽然不释放连接线程,但这条线程不会对服务器造成太大压力,而 Close后,表中的数据在本地内存中就会释放掉了,可以缓解本地压力。如果你想彻底销毁Query,请用Free.
    另外需要指出的是,   
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add( ‘select * from table’ );
    改为
      ADOQuery1.SQL.Text := 'Select * From Table';
    看起来会更顺眼点。
      

  17.   


    不释放线程不会对服务器造成太大压力?这我知道,但我们写程序总要考虑全面呀,万一公司使用sql服务器的程序太多了呢?一两个线程不释放是没有大压力,但是,庞大的数量以后呢?我要解决这问题并不是已经发生了问题了,而是想防患于未然。你说彻底销毁用Free,但我之前就试过了啊,adoquery1.Free以后,sql里使用exec sp_who还是有这个adoquery1的连接线程。目前我试过只有两种才能出去这连接线程:一、关闭程序。二、adoquery.destroy!...
    继续请教。。
    ......To Be Continue.............
      

  18.   

    谢谢楼上那么多帮助我的人,虽然问题暂时没有解决,但是交流中,还是学到了不少。各位,辛苦了!Best Regards!
      

  19.   

    我刚临下班实现了一下, 发觉一直对一个 ADOQuery 的 Close, Open 操作, SQL Server 的线程数量一直都没变.测试环境, Delphi 7, SQL Server 2000.
    每个程序对应一个 ADOConnetion, 每个窗体对应一个 ADOQuery, 如果在窗体释放后, 同时 Destroy, 会不会好一点呢?窗口开启再创建就是了.
      

  20.   

    我们公司的工作方式, 像Query这种控件, 都是放在窗体类的private里, 窗体Create时创建, Destroy时释放.另外增加一个ReOpen过程
    将Query和SQL语句传过去, ReOpen负责重新开启Query.
      

  21.   

    我指的是怎么结束掉query所占的处理线程,而不是SQL连接数。  一个sql连接有好多处理线程的
      

  22.   

    根据我刚刚的测试观察,
    发觉真正占到 Exec sp_who 的线程数是 ADOConnection, 而并非 ADOQuery.我的实验方法很简单, 在窗体中建立1个ADOConnetion, 2个AdoQuery, sp_who后, 发觉仅多出一个线程(SQL查询分析器的连接不要算在其中).而我每多开启一遍该程序, 线程数会多增加一次。(所以我敢断定这个线程数就是连接数).你也好好试下,至于限制ADOConnetion,就没太大必要了,一个程序基本固定是一个Connetion,除非你连接多个数据库。
      

  23.   


    "而我每多开启一遍该程序, 线程数会多增加一次。(所以我敢断定这个线程数就是连接数)."?
    那我一个程序就用到一个adoconnection,exec sp_who得到1000多线程数。这么说我们公司开了1000个应用程序了→_→我去试试你说的
      

  24.   

    新建一个DataBase, 试试吧(这样容易看些)。恐怕就是Connetion过多造成的。
      

  25.   

    好像真是的,不过我程序就一个adoconnection啊?! 所有的adoquery都连在一个adoconnection里,为什么会有1000多个线程呢?!公司真开了1000多个啊!
      

  26.   

    首先1000多个进程,不一定都是你的程序连接产生的进程。
    首先检查查询结果的dbname,看是否是其它数据库的进程,看看Exce sp_who 'active'
      

  27.   

    close database关掉adoconnection
      

  28.   


    关掉了那我其他界面的AdoQuery用什么