关于ADO数据库动态连接的问题

lpq21314-08 2014-10-17 08:36:04
最近想写一个数据库的项目,用D2010 写个两层的管理系统,用ADO连接数据库。
以前都是在DATAMODULE里放一个ADOCONNECTION,所有模块共用,但是发现网络一断,程序就死掉了。
现在想所有访问数据库的连接都动态创建,使用完马上释放掉,就是程序里只保存一个数据库的连接字符串,具体代码如下 :

var
aqry:TADOQuery;
begin
aqry:=TADOQuery.Create(Self);
aqry.connectionString:=mydbconstring; //mydbconstring 是事先保存起来的数据库连接字符串,是一个全局变量
aqry.close;
aqry.sql.text:='select * from aaa';
try
aqry.open;
except
end;
...........
//使用完后释放
aqry.close;
aqry.destory;
end;


现在做了几个测试是没有问题,但是以后系统做大了,数据量大,访问多的情况下,这种方式是否可行,会不会造成数据库连接池的压力等等问题,欢迎大家讨论一下 !!!
...全文
200 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aniugee 2014-10-23
  • 打赏
  • 举报
回复
引用 10 楼 u014653768 的回复:
[quote=引用 9 楼 aniugee 的回复:] 你连的如果是本机或者局域网,问题不大。我写过的1分钟内连接断开200次左右,没有发现问题。 这方面你可以做一个测试去验证一下。
我的系统也只限于在局域网内使用的,你说的1分钟内连接断开200次这是使用哪一种方法的?[/quote] 不用连接池,就一个连接。connetion提前创建,ADO动态创建释放。
lpq21314-08 2014-10-17
  • 打赏
  • 举报
回复
使用 adocon.KeepConnection:=false; 后确实不会导致程序死掉了,只是数据库断开时会卡一下,等到数据库连接成功时,程序又可以正常操作了,这个方法不错,适合简单的程序方案。
lpq21314-08 2014-10-17
  • 打赏
  • 举报
回复
我现在改为:在主程序定义一个全局的 adocon , 在主窗体的oncreate事件里写:

adocon:=TADOConnection.create(NIL);
adocon.LoginPrompt:=false;
adocon.KeepConnection:=false;
adocon.connectionstring:=myconstr;
adocon.connected:=true;
中间调用数据库:

var
   aqry:TADOQuery;
begin
  aqry:=TADOQuery.Create(Self);
  aqry.Connection:=adocon;
  aqry.close;
  aqry.sql.text:='select * from aaa';
  try
    aqry.open;
  except
  end;
  ...........
  //使用完后释放
  aqry.close;
  aqry.destory;
end;
最后,在程序退出时,在主窗体的 onclose里写:

adocon.close;
adocon.destory;
你们看看这样子写的效率会不会好一些呢?
lpq21314-08 2014-10-17
  • 打赏
  • 举报
回复
引用 2 楼 ksrsoft 的回复:
如果简单,可以试试 ADOCONNECTION的KeepConnect=false属性
你的意思还是在DataModule里创建一个adoconnection,然后所有的组件连到它。 keepconnect =false 起到什么作用?
CCC的 2014-10-17
  • 打赏
  • 举报
回复
完全没有必要,你这样不停的创建又释放,反而会造成系统的压力,如果是因为网络不稳定,导致程序死掉,可以放个定时器,定时检查数据库连接,发现网络断掉,重连数据库就行了
缘中人 2014-10-17
  • 打赏
  • 举报
回复
如果简单,可以试试 ADOCONNECTION的KeepConnect=false属性
lyhoo163 2014-10-17
  • 打赏
  • 举报
回复
为什么不使用DataSnap,方便有效。 你这样连接,而不通过ADOCONNECTION连接,不是有效的好方法。放弃了一个有效的手段。这样会造成资源的浪费。
lpq21314-08 2014-10-17
  • 打赏
  • 举报
回复
引用 9 楼 aniugee 的回复:
你连的如果是本机或者局域网,问题不大。我写过的1分钟内连接断开200次左右,没有发现问题。 这方面你可以做一个测试去验证一下。
我的系统也只限于在局域网内使用的,你说的1分钟内连接断开200次这是使用哪一种方法的?
aniugee 2014-10-17
  • 打赏
  • 举报
回复
你连的如果是本机或者局域网,问题不大。我写过的1分钟内连接断开200次左右,没有发现问题。 这方面你可以做一个测试去验证一下。
lpq21314-08 2014-10-17
  • 打赏
  • 举报
回复
引用 7 楼 Playmaster 的回复:
大型的项目可以用连接池,程序开始时创建一批连接放到连接池里,所有访问数据库的操作都使用连接池里的空闲连接,用前把连接状态置为忙,用完再把连接状态置为空闲。这样既不是所有操作都共用一个连接,也不是无限制创建连接。可以根据网络状况设置初始创建的连接数量。
你这个思路挺好,但是我的小型项目,只要一个连接就足够了,因为我这个程序最多10个用户同时在线,估计能应付了。
Playmaster 2014-10-17
  • 打赏
  • 举报
回复
大型的项目可以用连接池,程序开始时创建一批连接放到连接池里,所有访问数据库的操作都使用连接池里的空闲连接,用前把连接状态置为忙,用完再把连接状态置为空闲。这样既不是所有操作都共用一个连接,也不是无限制创建连接。可以根据网络状况设置初始创建的连接数量。

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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