设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 6514|回复: 19
打印 上一主题 下一主题

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

[复制链接]
1#
发表于 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
2#
发表于 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(这样的做法不见得更好)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-8 23:29 , Processed in 0.094990 second(s), 25 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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