數據庫連接是一種重要的、有限的、開銷昂貴的資源,因此用好連接對象是任何應用的最基本的要求。使用數據庫連接的要點可總結如下:
(1)保存連接字符串應注意安全。
(2)打開連接應遲,關閉連接應早。
連接字符串是訪問數據庫的鑰匙。連接字符串除了說明要訪問的數據之外,還包含了用戶為什么可以訪問那些數據的身份證明。在執行數據庫操作時,用戶身份證明是確定數據訪問權限的最重要的因素。
1、保存連接字符串
目前,硬編碼的連接字符串具有最好的性能,因為它們直接編譯進了應用的代碼之中。然而,硬編碼的字符串影響程序的靈活性,一旦連接字符串改變,應用程序必須重新編譯。
將連接字符串保存到外部提高了靈活性,代價是訪問外部字符串需要付出額外的開銷。但在絕大多數情況下,由此導致的性能開銷可以忽略不計,真正需要擔心的是安全問題。例如,攻擊者可能修改、竊取連接字符串。將連接字符串保存到外部環境的常見途徑有:配置文件,UDL文件,Windows注冊表。
.NET框架配置文件以純文本文件的形式部署,訪問方便。如果連接字符串包含密碼,文本格式將是最大的缺陷所在,因為密碼將以明文的形式保存。可以考慮引入一個專用的加密/解密引擎,不過這部分工作需要開發者自己完成。
UDL文件是供OLE DB提供者使用的文本文件,也就是說,SQL Server托管提供者不支持UDL文件。UDL文件也存在和前面的配置文件一樣的安全問題,總地看來優勢不多。
最后,Windows注冊表可以作為一個天然安全的存儲場所。注冊表是一個保存關鍵信息的系統知識庫,如果結合運用加密技術,可以達到較高的安全性。使用注冊表的主要缺點是部署麻煩,要求創建注冊鍵(可能還要執行加密)以及從注冊表讀取數據。雖然.NET Framework提供了一組調用底層Win32 API的封裝類,但這些類都沒有提供加密功能。ASPnet_setreg.exe工具可以用來創建HKEY_LOCAL_MACHINE下的注冊鍵保存用戶名稱和密碼,例如:aspnet_setreg.exe -k "Software/MyData" -u:userID -p:password。該ming令將加密指定的用戶ID和密碼。
2、 連接池原理
連接池允許我們通過一個緩沖池重用現有的連接對象,避免每次使用連接對象時都要新建一個對象。采用連接池之后,只要少量的連接對象就可以滿足大量客戶端的需要。
每一個連接池都與一個獨立的連接字符串及其事務上下文關聯。每次打開一個新的連接,數據提供者會嘗試將指定的連接字符串與連接池的字符串進行匹配。如果匹配失敗,數據提供者創建一個新的連接并將它加入連接池。連接池被創建之后,除非進程結束,否則不會被拆除。有人認為這種處理方式會影響性能,其實不然,維護一個不活動的或者空的連接池不需要多少開銷。
連接池創建之后,系統會創建一些連接對象并將它們加入連接池,直至達到額定的最小連接對象數量。以后,系統會根據需要新建和加入連接對象,一直到達最大連接對象數量限額為止。如果程序請求一個連接對象時沒有空閑的連接對象可用,且連接池里面的對象數量已達到上限,則請求被放入隊列,一旦有連接被釋放回緩沖池就立即取出使用。
避免用編程的方式構造連接字符串。如果通過合并多個輸入數據的方式構造出連接字符串,很容易給注入式攻擊以可乘之機。如果必須用到用戶輸入的數據,務必進行嚴ge的驗證。
3、關閉連接
關閉一個連接時,連接對象被返回給連接池以便重用,但這時實際的數據庫連接并未被拆除。如果禁用了連接池,則實際的數據庫連接也被關閉。這里必須強調的一點時,連接對象使用完畢后應當顯式關閉并將它返回給連接池,不要依靠垃圾收集器來釋放連接。實際上,當連接對象的引用超出有效范圍時,連接不一定被關閉——垃圾收集器的功能是拆除代表物理連接的.NET封裝對象,但這并不意味著底層的連接也被關閉了。
調用Close或Dispose方法可以將連接釋放回連接池。只有當生存期結束或出現嚴重錯誤時,連接對象才會被從連接池刪除。
4、連接池與安全
如果一個應用程序的所有數據訪問操作都使用同樣的連接字符串,連接池的優勢將發揮到極限。但是,這只是一種理想化了的狀況,很可能與應用程序的其他要求存在沖突。例如,如果只使用一個連接字符串,要在數據庫這一層次上執行安全控制就很困難了。
另一方面,如果讓每一個用戶分別使用自己的連接字符串(即為每一個用戶分別設定數據庫帳戶),勢必出現大量小型的連接池,許多連接根本不會被重用。依照慣例,這類問題的最佳解決方案是尋找兩個極端之間的一個適當折衷點。我們可以設置一組具有代表性的公用帳戶,同時修改存儲過程,使之接受一個表示用戶標識的參數,存儲過程根據傳入的用戶標識執行不同的操作。
新聞熱點
疑難解答
圖片精選