Office中国论坛/Access中国论坛

标题: ADP开发思考(一)——数据库连接 [打印本页]

作者: zhuyiwen    时间: 2014-12-15 10:53
标题: ADP开发思考(一)——数据库连接
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的默认连接以避免上述问题呢?

作者: tmtony    时间: 2014-12-15 11:48
如果连接不断开,网络断开,会出现类似链接表的问题
如果连接断开 再打开 ,也会存在效率的问题
作者: 风中漫步    时间: 2014-12-15 15:29
期待中....................
作者: ganlinlao    时间: 2014-12-16 00:00
菜鸟个人愚见:
       首先这是涉及到一个sql server连接池的问题。sql server毫无疑问是有连接池。但这个连接池在哪里呢?连接池是在客户端。这就带来的一个問题?当connection.open时打开了一个连接,并连接到sql server,但当connection.close时,连接断开了吗?连接并没有断开,客户端依然连着SQL server,connection只不过重新回归到连接池中,除非adp或access完全退出,windows才会重置连接池。windows这样做的目的很明显,为了提高性能。
      所以频繁的连接和断开并没有影响性能。因为重新的connection只不过是从连接池中取出原来的连接,断开只不过是让connection回归到连接池中
作者: zhuyiwen    时间: 2014-12-16 09:35
有道理。

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

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

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

作者: t小宝    时间: 2014-12-16 13:20
学习了,都有道理呵!
既然是数据管理系统,运行中肯定要不断使用数据,还是让它一直连着好吧,能占用多少带宽呢
作者: 风中漫步    时间: 2014-12-16 13:25
"应用程序对该连接调用 Close 时,池进程会将连接返回到活动连接池集中,而不是真正关闭连接。 连接返回到池中之后,即可在下一个 Open 调用中重复使用"

这种有官方点的资料吗?
作者: ganlinlao    时间: 2014-12-16 15:11
本帖最后由 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
开了个好贴,长知识了,谢谢大家.我们继续

作者: zhuyiwen    时间: 2014-12-16 19:53
SQLServer的连接有多种,用得最多的管道协议、TCP/IP协议和共享内存,其中,TCP/IP是基于SOCKET。
作者: 风中漫步    时间: 2014-12-17 13:32
ganlinlao兄:这句"这也是为什么我在上面会说当connection.close时,物理连接并没有断开,而只是回归到客户端的连接池,"该怎样理解?是依旧连接在服务器上?
作者: zhuyiwen    时间: 2014-12-19 10:29
想来想去,我觉得动态连接连接ADP比使用另一个ADO连接还是要好些。

如果,使用另一个ADO连接,虽然可以节约一些带宽,但是设计变得麻烦很多,还要去管理连接,这是其一;其二,会损失一些ADP(也就是Access)本身的功能。有了这两点,就会丧失ADP(Access)本身快捷开发的优势。

得出这样一个结论来,那么如何更有效地管理ADP本身的连接就很重要。


另外,能不能两个连接(ADP本身+另一个ADO连接)合理使用。如,有数据绑定时使用ADP本身的连接,不是绑定时使用另一个ADO连接,那又会怎么样呢?

ADO连接没有事件,ADP的连接同样如此。

暂时只想到这么多。呵呵

作者: dorenmi    时间: 2014-12-23 10:48
先拜读一下贵贴,学习学习~~~
作者: lwwvb    时间: 2015-2-24 10:13
建议普通两层的程序,还是让它一直连上。如果客户端数量多,闲置太久的客户端可以关闭连接,用时再连上。某些系统,如果某个客户端会使用得非常多的界面,可以另外处理成ADO.NET的断开方式。
作者: 522650696    时间: 2016-4-26 17:14
开了个好贴,长知识了,谢谢大家.我们继续
作者: euilo    时间: 2018-10-4 22:52
学习看看
作者: euilo    时间: 2018-10-4 22:52
学习看看,谢谢共享




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3