设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 6429|回复: 19

ADP开发思考(一)——数据库连接

[复制链接]

点击这里给我发消息

发表于 2014-12-15 10:53:35 | 显示全部楼层 |阅读模式
ADP与传统的Access应用程序的最大不同就是用ADO作为数据处理的接口,而传统的Access应用程序则是采用DAO。那么当然就有些基于DAO的命令和函数不能在ADP中使用,如,CurrentDB()、OpenRecordset()等。

ADP有一个默认的ADO连接,该连接是用于ADP连接当前的SQLServer数据库。有了这个连接,就能非常方便在窗体和报表中绑定记录源,使得应用程序的开发与传统的Access应用程序开发非常类似和快捷(这是比其它开发工具更强大的地方,如VB/C#等)。这样一来就可以使用Docmd对象的RunSQL命令、Application应用程序对象的DLookup的D类函数。

但是ADP连接SQLServer时,就会获取SQLServer数据库的架构信息,如表、视图、存储过程等,这些都是需要占用网络、需要时间的。由于C/S开发的一个原则是尽量少占用数据库的连接,使用完毕应该立即断开数据库连接,所以,一个的ADP应用程序,应该保持最短的连接时间,以释放SQLServer服务器资源。但是,如果频繁的断开和连接数据库,必然会影响应用程序的速度。

那么,有没有可能用另一个ADO连接代替ADP的默认连接以避免上述问题呢?

本帖被以下淘专辑推荐:

点击这里给我发消息

发表于 2014-12-16 13:20:44 来自手机 | 显示全部楼层
学习了,都有道理呵!
既然是数据管理系统,运行中肯定要不断使用数据,还是让它一直连着好吧,能占用多少带宽呢来自: Android客户端

点评

不错。但是,长连接不一定在长使用,有可能是长闲置,服务器资源浪费厉害。不是带宽问题,而是服务器资源问题.  发表于 2014-12-17 09:02
回复 支持 0 反对 1

使用道具 举报

点击这里给我发消息

发表于 2014-12-15 11:48:30 | 显示全部楼层
如果连接不断开,网络断开,会出现类似链接表的问题
如果连接断开 再打开 ,也会存在效率的问题
发表于 2014-12-15 15:29:35 | 显示全部楼层
期待中....................
回复

使用道具 举报

发表于 2014-12-16 00:00:33 | 显示全部楼层
菜鸟个人愚见:
       首先这是涉及到一个sql server连接池的问题。sql server毫无疑问是有连接池。但这个连接池在哪里呢?连接池是在客户端。这就带来的一个問题?当connection.open时打开了一个连接,并连接到sql server,但当connection.close时,连接断开了吗?连接并没有断开,客户端依然连着SQL server,connection只不过重新回归到连接池中,除非adp或access完全退出,windows才会重置连接池。windows这样做的目的很明显,为了提高性能。
      所以频繁的连接和断开并没有影响性能。因为重新的connection只不过是从连接池中取出原来的连接,断开只不过是让connection回归到连接池中

点评

新观点,与我所看到的资料不同  发表于 2014-12-16 13:04

点击这里给我发消息

 楼主| 发表于 2014-12-16 09:35:58 | 显示全部楼层
有道理。

不过,连接池是指将的连接资源保存在连接池中,重新连接时,可以迅速将资源分配给客户端。不代表客户端断开连接后,客户端还连接着数据库。

虽然,有连接池ADP重新连接数据库,可以效率很高,但不排除它会重新获取数据库架构信息。连接池只能提高服务器的效率,不能降低ADP对带宽的影响。

好像只有SQLServer 2005以上的版本支持连接池吧。

点评

zhu兄的SQL Server(MSDE)简易管理器到哪个版本了,来晚了  发表于 2014-12-16 13:41
发表于 2014-12-16 13:25:49 | 显示全部楼层
"应用程序对该连接调用 Close 时,池进程会将连接返回到活动连接池集中,而不是真正关闭连接。 连接返回到池中之后,即可在下一个 Open 调用中重复使用"

这种有官方点的资料吗?
发表于 2014-12-16 15:11:39 | 显示全部楼层
本帖最后由 ganlinlao 于 2014-12-16 15:16 编辑

带连接池功能的编程接口

微软的SQLSERVER客户端编程接口:

ADO和ADO.NET 都支持连接池这种机制

JAVA的JDBC也支持连接池这种机制

注意:连接池机制是客户端数据库驱动程序提供的,功能都在驱动程序里,所以JDBC跟ADO,ADO.NET的连接池功能会有区别

因为客户端应用程序都是通过加载SQLSERVER的数据驱动控件做SQLSERVER连接。目前客户端数据库驱动程序主要有3种:

1、MDAC(微软数据访问组件) SQL2000的时候开始有的

2、SQLSERVER Native Client SQL2005开始引入的

3、Microsoft JDBC Provider  使用机制与MDAC和SQLSERVER Native Client不同

问题1:SQLServer连接池被创建在SQLClient端还是SQLServer端?

答案:在客户端

当应用程序运行的时候,会有一个连接池的管理控件运行在应用程序的进程里,统一管理应用程序和SQLSERVER建立的所有连接,

并且维护这些连接一直处于活动状态。当有用户发出一个connection open指令时连接池会在自己维护的连接池中找一个处于空闲状态

的连接放回自己管理的连接池里,给这个用户使用。当用户使用完毕后,发出connection close指令,连接池会把这个连接放回自己管理的连接池里,
让他重新处于空闲状态,而不是真的从SQL里登出。这样如果下次有用户需要相同连接,就可以重用这个连接,而无须再去做物理连接了。就是说连接池是放在客户端的,是客户端机制

问题2:ADP和SQL server的物理连接是基于socket吗?

基于socket的有状态连接,那么连接时起码要3次握手,断开连接要4次握手。也就是说物理连接的一开一关至少要7次握手,加上这7次之间的时间差(状态转换)。可见物理连接的一开一关是多么的费时。这也是为什么微软要使用连接池。
SQL server的连接池真正断开物理连接的时间默认是60秒 (oledb的连接池是15+30秒)。这也是为什么我在上面会说当connection.close时,物理连接并没有断开,而只是回归到客户端的连接池,

因为vba是单线程的,所以无论使用多少个recordset,它总是使用一个connection。除非是多线程中,每一个线程开一个connection,这样子才有办法让客户端的连接池多建新的connection。

真正不影响SQL server的带宽,就是要么缩短客户端的连接池CPTimeout(这个估计难),要么不使用有状态的socket通信,改用无状态的http协议连接SQL server(这样的做法不见得更好)
发表于 2014-12-16 17:44:05 | 显示全部楼层
开了个好贴,长知识了,谢谢大家.我们继续

点击这里给我发消息

 楼主| 发表于 2014-12-16 19:53:36 | 显示全部楼层
SQLServer的连接有多种,用得最多的管道协议、TCP/IP协议和共享内存,其中,TCP/IP是基于SOCKET。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-18 15:47 , Processed in 0.096789 second(s), 42 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表