5,927
社区成员




问题一:
我的dbgrid连的DataSource1,而DataSource1连的是ADOQuery1,ADOQuery1连的是ADOConnection1
很多人说取完数据后把ADOConnection1断开,要取数据的时候再连上,请问这个有必要断开吗?断开能大大改善性能吗?
问题二:
一个窗口里放多个(2,3个)ADOQuery1(先不讨论为什么放多个的问题),都连着ADOConnection1,同时打开几十个窗口,同时有几十人使用,并不是用的时候连上ADOConnection1,而是一直连着,这样会影响性能吗?
问题三:
ADOQuery1不是创建的,是拉进去的控件,窗口是show的,也可能是showmodel的,那么窗口关闭会自动销毁ADOQuery1和连接吗?
简单一点回复你吧:
1.ADOConnection1没必要断开,你可以创建一个DataModule把ADOConnection1放到里面,一直保持连接就行,这样性能是最好的,因为省去了每次查询连接的问题
2.窗口关闭,窗口内所有的东西都会自动释放,不需额外做什么
说一下CS的情况:
一般情况下,一个程序只有一个ADOConnection,放在DataModule中,程序启动时连接。其他Form什么的都引用这个DataModule,Form上的查询组件都连接这个ADOConnection,所以一个程序就只有一个和数据库的TCP连接,就是ADOConnection和数据的连接。可以用TCPview测试。同时有几十个连接对一般计算机都谈不上影响,对性能有影响是数据执行的内容。对SQL来说,少量+多次+结构简单就是性能。
长连接:ADOConnection有个KeepConnection属性,默认为true,所以默认情况下,ADOConnection是长连接。
短连接:可以测试KeepConnection为false的情况,也可以更直接的在查询后主动断开连接。
长连接,50个以内的客户端一般都没问题,缺点是,断网就只能重启程序(有条件可以改造一下ADOConnection支持断网重连)。
网络差的情况下,用短连接,每次查询之前都要先连接,有点卡顿的感觉。
个人感觉长连接的CS程序最能体现Delphi的快速开发的特点,其他什么3层,多层,都首选java+html。
1:很多人说窗口关闭,那么ADOQuery1和ADOConnection1的连接也会自动断开
2:几十台电脑连着数据库服务器,每台电脑的系统打开几十个窗口,每个窗口里放了2,3个ADOQuery1,都连着ADOConnection1,不是三层,也不是BS,就是普通的CS,这样会对性能有影响吗?
问题1:如果是数据库在本机,你的程序就一个客户端连接数据库,或者说是一个简单程序,那就可以不用去断开连接。因为每次连接是比较花费时间处理的。但如果是较大的系统、数据连接可能会很多,断开就很有必要的(然而这种情况,通常就使用连接池了,基本不会像你这样单一的使用)
问题2:你这问题就不可能出现,一个窗体会几十个人使用,就必须是C/S或三层方式,那么就不可能是一个ADOConnection1。当然,你有可能是做成BS模式的,这种的话,不管你用什么样的方式,其实系统都会是多个ADOConnection1的,当然,不排除ADOConnection1放错地方的情况下,那样的话,一个ADOConnection1必须得出错。最后再说:如果系统会有很多人使用的时候,就一定会用到“池”。
问题3:窗口关闭不会销毁,是窗口销毁的时候才销毁。这是两个不同事件(关闭、销毁)