问三个问题,关于ADOQuery1,ADOConnection1

nimeide1234567890 2022-06-20 09:32:52

问题一:
我的dbgrid连的DataSource1,而DataSource1连的是ADOQuery1,ADOQuery1连的是ADOConnection1
很多人说取完数据后把ADOConnection1断开,要取数据的时候再连上,请问这个有必要断开吗?断开能大大改善性能吗?

问题二:
一个窗口里放多个(2,3个)ADOQuery1(先不讨论为什么放多个的问题),都连着ADOConnection1,同时打开几十个窗口,同时有几十人使用,并不是用的时候连上ADOConnection1,而是一直连着,这样会影响性能吗?

问题三:
ADOQuery1不是创建的,是拉进去的控件,窗口是show的,也可能是showmodel的,那么窗口关闭会自动销毁ADOQuery1和连接吗?

...全文
127 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
葫芦老四 2022-07-06
  • 打赏
  • 举报
回复

简单一点回复你吧:
1.ADOConnection1没必要断开,你可以创建一个DataModule把ADOConnection1放到里面,一直保持连接就行,这样性能是最好的,因为省去了每次查询连接的问题
2.窗口关闭,窗口内所有的东西都会自动释放,不需额外做什么

hj8090 2022-06-21
  • 打赏
  • 举报
回复

说一下CS的情况:
一般情况下,一个程序只有一个ADOConnection,放在DataModule中,程序启动时连接。其他Form什么的都引用这个DataModule,Form上的查询组件都连接这个ADOConnection,所以一个程序就只有一个和数据库的TCP连接,就是ADOConnection和数据的连接。可以用TCPview测试。同时有几十个连接对一般计算机都谈不上影响,对性能有影响是数据执行的内容。对SQL来说,少量+多次+结构简单就是性能。
长连接:ADOConnection有个KeepConnection属性,默认为true,所以默认情况下,ADOConnection是长连接。
短连接:可以测试KeepConnection为false的情况,也可以更直接的在查询后主动断开连接。
长连接,50个以内的客户端一般都没问题,缺点是,断网就只能重启程序(有条件可以改造一下ADOConnection支持断网重连)。
网络差的情况下,用短连接,每次查询之前都要先连接,有点卡顿的感觉。
个人感觉长连接的CS程序最能体现Delphi的快速开发的特点,其他什么3层,多层,都首选java+html。

nimeide1234567890 2022-06-22
  • 举报
回复
@hj8090 了解
nimeide1234567890 2022-06-20
  • 打赏
  • 举报
回复

1:很多人说窗口关闭,那么ADOQuery1和ADOConnection1的连接也会自动断开
2:几十台电脑连着数据库服务器,每台电脑的系统打开几十个窗口,每个窗口里放了2,3个ADOQuery1,都连着ADOConnection1,不是三层,也不是BS,就是普通的CS,这样会对性能有影响吗?

tanqth 2022-06-21
  • 举报
回复
@nimeide1234567890 1、需要严格理解“关闭”,关闭不等于释放;不是释放,就不会自动去断开连接。 2、几十台电脑,从某种角度来说,他确实不怎么影响(关键是对这个影响的“度”怎么衡量),你这就相当于几十个数据库连接。从安全与高要求来说,不建议这样做,这都是相对来说。小系统可以完全不考虑这些因素。
nimeide1234567890 2022-06-22
  • 举报
回复
@tanqth 了解
tanqth 2022-06-20
  • 打赏
  • 举报
回复

问题1:如果是数据库在本机,你的程序就一个客户端连接数据库,或者说是一个简单程序,那就可以不用去断开连接。因为每次连接是比较花费时间处理的。但如果是较大的系统、数据连接可能会很多,断开就很有必要的(然而这种情况,通常就使用连接池了,基本不会像你这样单一的使用)
问题2:你这问题就不可能出现,一个窗体会几十个人使用,就必须是C/S或三层方式,那么就不可能是一个ADOConnection1。当然,你有可能是做成BS模式的,这种的话,不管你用什么样的方式,其实系统都会是多个ADOConnection1的,当然,不排除ADOConnection1放错地方的情况下,那样的话,一个ADOConnection1必须得出错。最后再说:如果系统会有很多人使用的时候,就一定会用到“池”。
问题3:窗口关闭不会销毁,是窗口销毁的时候才销毁。这是两个不同事件(关闭、销毁)

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧