Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

12下一頁(yè)
返回列表 發(fā)新帖
查看: 7010|回復(fù): 19
打印 上一主題 下一主題

ADP開(kāi)發(fā)思考(一)——數(shù)據(jù)庫(kù)連接

[復(fù)制鏈接]

點(diǎn)擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2014-12-15 10:53:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
ADP與傳統(tǒng)的Access應(yīng)用程序的最大不同就是用ADO作為數(shù)據(jù)處理的接口,而傳統(tǒng)的Access應(yīng)用程序則是采用DAO。那么當(dāng)然就有些基于DAO的命令和函數(shù)不能在ADP中使用,如,CurrentDB()、OpenRecordset()等。

ADP有一個(gè)默認(rèn)的ADO連接,該連接是用于ADP連接當(dāng)前的SQLServer數(shù)據(jù)庫(kù)。有了這個(gè)連接,就能非常方便在窗體和報(bào)表中綁定記錄源,使得應(yīng)用程序的開(kāi)發(fā)與傳統(tǒng)的Access應(yīng)用程序開(kāi)發(fā)非常類似和快捷(這是比其它開(kāi)發(fā)工具更強(qiáng)大的地方,如VB/C#等)。這樣一來(lái)就可以使用Docmd對(duì)象的RunSQL命令、Application應(yīng)用程序?qū)ο蟮腄Lookup的D類函數(shù)。

但是ADP連接SQLServer時(shí),就會(huì)獲取SQLServer數(shù)據(jù)庫(kù)的架構(gòu)信息,如表、視圖、存儲(chǔ)過(guò)程等,這些都是需要占用網(wǎng)絡(luò)、需要時(shí)間的。由于C/S開(kāi)發(fā)的一個(gè)原則是盡量少占用數(shù)據(jù)庫(kù)的連接,使用完畢應(yīng)該立即斷開(kāi)數(shù)據(jù)庫(kù)連接,所以,一個(gè)的ADP應(yīng)用程序,應(yīng)該保持最短的連接時(shí)間,以釋放SQLServer服務(wù)器資源。但是,如果頻繁的斷開(kāi)和連接數(shù)據(jù)庫(kù),必然會(huì)影響應(yīng)用程序的速度。

那么,有沒(méi)有可能用另一個(gè)ADO連接代替ADP的默認(rèn)連接以避免上述問(wèn)題呢?

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖2 訂閱訂閱

點(diǎn)擊這里給我發(fā)消息

推薦
發(fā)表于 2014-12-16 13:20:44 來(lái)自手機(jī) | 只看該作者
學(xué)習(xí)了,都有道理呵!
既然是數(shù)據(jù)管理系統(tǒng),運(yùn)行中肯定要不斷使用數(shù)據(jù),還是讓它一直連著好吧,能占用多少帶寬呢來(lái)自: Android客戶端

點(diǎn)評(píng)

不錯(cuò)。但是,長(zhǎng)連接不一定在長(zhǎng)使用,有可能是長(zhǎng)閑置,服務(wù)器資源浪費(fèi)厲害。不是帶寬問(wèn)題,而是服務(wù)器資源問(wèn)題.  發(fā)表于 2014-12-17 09:02

點(diǎn)擊這里給我發(fā)消息

2#
發(fā)表于 2014-12-15 11:48:30 | 只看該作者
如果連接不斷開(kāi),網(wǎng)絡(luò)斷開(kāi),會(huì)出現(xiàn)類似鏈接表的問(wèn)題
如果連接斷開(kāi) 再打開(kāi) ,也會(huì)存在效率的問(wèn)題
3#
發(fā)表于 2014-12-15 15:29:35 | 只看該作者
期待中....................
回復(fù)

使用道具 舉報(bào)

4#
發(fā)表于 2014-12-16 00:00:33 | 只看該作者
菜鳥個(gè)人愚見(jiàn):
       首先這是涉及到一個(gè)sql server連接池的問(wèn)題。sql server毫無(wú)疑問(wèn)是有連接池。但這個(gè)連接池在哪里呢?連接池是在客戶端。這就帶來(lái)的一個(gè)問(wèn)題?當(dāng)connection.open時(shí)打開(kāi)了一個(gè)連接,并連接到sql server,但當(dāng)connection.close時(shí),連接斷開(kāi)了嗎?連接并沒(méi)有斷開(kāi),客戶端依然連著SQL server,connection只不過(guò)重新回歸到連接池中,除非adp或access完全退出,windows才會(huì)重置連接池。windows這樣做的目的很明顯,為了提高性能。
      所以頻繁的連接和斷開(kāi)并沒(méi)有影響性能。因?yàn)橹匦碌腸onnection只不過(guò)是從連接池中取出原來(lái)的連接,斷開(kāi)只不過(guò)是讓connection回歸到連接池中

點(diǎn)評(píng)

新觀點(diǎn),與我所看到的資料不同  發(fā)表于 2014-12-16 13:04

點(diǎn)擊這里給我發(fā)消息

5#
 樓主| 發(fā)表于 2014-12-16 09:35:58 | 只看該作者
有道理。

不過(guò),連接池是指將的連接資源保存在連接池中,重新連接時(shí),可以迅速將資源分配給客戶端。不代表客戶端斷開(kāi)連接后,客戶端還連接著數(shù)據(jù)庫(kù)。

雖然,有連接池ADP重新連接數(shù)據(jù)庫(kù),可以效率很高,但不排除它會(huì)重新獲取數(shù)據(jù)庫(kù)架構(gòu)信息。連接池只能提高服務(wù)器的效率,不能降低ADP對(duì)帶寬的影響。

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

點(diǎn)評(píng)

zhu兄的SQL Server(MSDE)簡(jiǎn)易管理器到哪個(gè)版本了,來(lái)晚了  發(fā)表于 2014-12-16 13:41
7#
發(fā)表于 2014-12-16 13:25:49 | 只看該作者
"應(yīng)用程序?qū)υ撨B接調(diào)用 Close 時(shí),池進(jìn)程會(huì)將連接返回到活動(dòng)連接池集中,而不是真正關(guān)閉連接。 連接返回到池中之后,即可在下一個(gè) Open 調(diào)用中重復(fù)使用"

這種有官方點(diǎn)的資料嗎?
8#
發(fā)表于 2014-12-16 15:11:39 | 只看該作者
本帖最后由 ganlinlao 于 2014-12-16 15:16 編輯

帶連接池功能的編程接口

微軟的SQLSERVER客戶端編程接口:

ADO和ADO.NET 都支持連接池這種機(jī)制

JAVA的JDBC也支持連接池這種機(jī)制

注意:連接池機(jī)制是客戶端數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序提供的,功能都在驅(qū)動(dòng)程序里,所以JDBC跟ADO,ADO.NET的連接池功能會(huì)有區(qū)別

因?yàn)榭蛻舳藨?yīng)用程序都是通過(guò)加載SQLSERVER的數(shù)據(jù)驅(qū)動(dòng)控件做SQLSERVER連接。目前客戶端數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序主要有3種:

1、MDAC(微軟數(shù)據(jù)訪問(wèn)組件) SQL2000的時(shí)候開(kāi)始有的

2、SQLSERVER Native Client SQL2005開(kāi)始引入的

3、Microsoft JDBC Provider  使用機(jī)制與MDAC和SQLSERVER Native Client不同

問(wèn)題1:SQLServer連接池被創(chuàng)建在SQLClient端還是SQLServer端?

答案:在客戶端

當(dāng)應(yīng)用程序運(yùn)行的時(shí)候,會(huì)有一個(gè)連接池的管理控件運(yùn)行在應(yīng)用程序的進(jìn)程里,統(tǒng)一管理應(yīng)用程序和SQLSERVER建立的所有連接,

并且維護(hù)這些連接一直處于活動(dòng)狀態(tài)。當(dāng)有用戶發(fā)出一個(gè)connection open指令時(shí)連接池會(huì)在自己維護(hù)的連接池中找一個(gè)處于空閑狀態(tài)

的連接放回自己管理的連接池里,給這個(gè)用戶使用。當(dāng)用戶使用完畢后,發(fā)出connection close指令,連接池會(huì)把這個(gè)連接放回自己管理的連接池里,
讓他重新處于空閑狀態(tài),而不是真的從SQL里登出。這樣如果下次有用戶需要相同連接,就可以重用這個(gè)連接,而無(wú)須再去做物理連接了。就是說(shuō)連接池是放在客戶端的,是客戶端機(jī)制

問(wèn)題2:ADP和SQL server的物理連接是基于socket嗎?

基于socket的有狀態(tài)連接,那么連接時(shí)起碼要3次握手,斷開(kāi)連接要4次握手。也就是說(shuō)物理連接的一開(kāi)一關(guān)至少要7次握手,加上這7次之間的時(shí)間差(狀態(tài)轉(zhuǎn)換)?梢(jiàn)物理連接的一開(kāi)一關(guān)是多么的費(fèi)時(shí)。這也是為什么微軟要使用連接池。
SQL server的連接池真正斷開(kāi)物理連接的時(shí)間默認(rèn)是60秒 (oledb的連接池是15+30秒)。這也是為什么我在上面會(huì)說(shuō)當(dāng)connection.close時(shí),物理連接并沒(méi)有斷開(kāi),而只是回歸到客戶端的連接池,

因?yàn)関ba是單線程的,所以無(wú)論使用多少個(gè)recordset,它總是使用一個(gè)connection。除非是多線程中,每一個(gè)線程開(kāi)一個(gè)connection,這樣子才有辦法讓客戶端的連接池多建新的connection。

真正不影響SQL server的帶寬,就是要么縮短客戶端的連接池CPTimeout(這個(gè)估計(jì)難),要么不使用有狀態(tài)的socket通信,改用無(wú)狀態(tài)的http協(xié)議連接SQL server(這樣的做法不見(jiàn)得更好)
9#
發(fā)表于 2014-12-16 17:44:05 | 只看該作者
開(kāi)了個(gè)好貼,長(zhǎng)知識(shí)了,謝謝大家.我們繼續(xù)

點(diǎn)擊這里給我發(fā)消息

10#
 樓主| 發(fā)表于 2014-12-16 19:53:36 | 只看該作者
SQLServer的連接有多種,用得最多的管道協(xié)議、TCP/IP協(xié)議和共享內(nèi)存,其中,TCP/IP是基于SOCKET。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2024-10-23 06:20 , Processed in 0.170418 second(s), 41 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表