2009-08-05 63 views

回答

17

我們採用基於我們的生產經驗的一些做法:從連接池中提取它們

  • 驗證連接。
  • 寫您的服務代碼,不要假定連接是有效的 - 如果不這樣做可能會導致相當多的悲傷,特別是在生產環境中
  • 儘可能明確地接近和使用後丟棄的連接(using(conn){}塊不錯的選擇)
  • 在服務,你應該使用最短的時間內聯繫 - 特別是如果你正在尋找創建一個可擴展的解決方案。
  • 考慮對請求的典型持續時間使用適當的請求時使用顯式時序。你想要的最後一件事是有一種類型的請求掛起,可能會阻止你的整個系統。
  • 儘可能使用綁定變量,以避免硬解析在數據庫(這可能是一個噩夢般的表現,如果你不同意這個做法開始了)。使用綁定變量還可以保護您免受基本的SQL注入攻擊。
  • 請確保您有內置到系統中充足的診斷支持 - 考慮創建Oracle ADO周圍的包裝要求,這樣就可以儀器,記錄,並找到他們。
  • 考慮在可能的情況下使用存儲過程或視圖將數據模型的查詢語義和知識推送到數據庫中。這允許更簡單的配置和查詢調優。
  • 另外,可以考慮使用一個很好的ORM庫(EF,休眠等)封裝數據訪問 - 特別是如果你執行讀取和寫入操作。
  • 對上述內容進行擴展 - 不要用幾十個單獨編寫的SQL片段來代碼。這很快就成爲可維護性的噩夢。
  • 如果您承諾將Oracle作爲數據庫,不要害怕使用Oracle特有的功能。 ODP庫提供對大多數功能的訪問 - 例如返回表遊標,批處理操作等。
  • Oracle將空字符串(「」)和NULL視爲等價物 - .NET不會。使Oracle適合您的字符串處理。
  • 考慮使用,而不是VARCHAR2 NVARCHAR2如果你在你的數據庫直接存儲Unicode字符串的.NET。否則,轉換所有unicode字符串以符合核心ASCII子集。不這樣做可能會導致各種混亂和惡意數據損壞問題。
+0

+1這很有幫助。我會留下這個問題,以便其他人也可以爲此做出貢獻。 – Vivek 2009-08-05 15:12:46

+0

@LBushkin - 關閉連接不夠嗎?我爲什麼要處置? – 2012-06-21 07:52:23

+0

一般來說,如果一個類型實現了IDisposable,那麼在完成時調用Dispose()是一個好主意 - 這是一件很友好的事情,所以如果底層代碼執行任何優化(例如提前釋放資源)它有機會這樣做。在數據庫連接的特定情況下,一些庫在內部優化以響應連接處理 - 這對於應用程序和數據庫都是好事,因爲在大多數情況下連接實際上是集中的。僅僅關閉連接並不總是足以向底層提供者暗示你已完成。 – LBushkin 2012-06-22 00:39:25

3

Oracle的供應商在ASP.NET應用程序正常工作,但要注意的:

  • 匹配的Oracle客戶端32位或64位的正確版本與您的應用程序池
  • 用於32位應用程序池的32位客戶端,用於64位應用程序池的64位客戶端。
  • 權限 - 授予應用程序池的用戶權限Oracle客戶端目錄(C:\ ORACLE \產品\ 10.2.0 \ Client_1上)

這不會有任何與ASP。NET,但重要的是要注意,Oracle存儲空字符串和null都爲null,所以如果您需要知道某些內容爲空且不爲空,則需要添加一個額外的列以跟蹤該內容...

4

一些更小技巧:使用Microsoft Oracle提供

+0

此外,Microsoft Oracle提供程序(與.NET框架一起提供)在解析大值到StoredProcedures時遇到問題。大型項目(大於32000字節,我相信)會導致錯誤類型的錯誤。當使用blob和long(這是存儲長文本)時,這會導致很大的問題。然而,參數化查詢能夠接收大項目(目前我的一個項目正在使用黑客來解決此問題)。 – Gertjan 2009-08-05 16:49:21

+0

存儲過程中字符串的最大長度爲32k個字符(或字節)。所有較大的應該是LOB類型(BLOB,CLOB或NCLOB)。一個LOB可以大於2GB。 – Christian13467 2009-08-06 00:12:08