1. 程式人生 > >[ASP.NET學習筆記之六]開發高效能的ADO.NET應用

[ASP.NET學習筆記之六]開發高效能的ADO.NET應用

開發高效能的ADO.NET應用

ADO.NET概述

面向連線模型

lADO.net 1.x讀取資料時必須儲存穩定的連線而且在每個連線上只能使用一個DataReader

lADO.net 2.0無此限制!一個連線可以開啟多個DataReader

ADO.NET效能最佳實踐

選用合適的Data Provider

lSQL Server .NET Data Provider

SQL Server 7.0 2000

通過TDS訪問資料庫

lOLE DB .NET Data Provider

SQL Server 6.5, Microsoft Access, Oracle, 或其他具有

OLE DB

提供者的資料庫。

lODBC .NET Data Provider

某些舊的系統

l.NET Data Provider for Oracle

Oracle 8.1.7或更高版本

lCustom .NET Data Provider

[注意] 可以自定義Data Provider,這個介面在.NET是公開的,你能夠自己實現這些類。

下面的圖示資料庫連線的比較:

Provider Factories

l在應用開發時,我們很多時候並不清楚目標環境是什麼資料庫,特別是做產品的時候。

lADO.NET 1.x使用介面IConnection IDataAdapter等等)來實現在資料庫的無關性,但程式設計師還是要寫很多程式碼。

lADO.NET 2.0使用了一些資料庫無關的抽象類介面,並提供“DbProviderFactory來獲得相應資料提供者。

真正的DataProvider。這是一個實現層,完成了資料庫具體提供者。

DbProviderFactory Methods

CreateConnection

CreateCommand

CreateCommandBuilder

CreateConnection

CreateConnectionStringBuilder

CreateDataAdapter

CreateDataSourceEnumerator

CreateParameter

CreatePermission

相關資料可以查閱MSDN。我們可以通過它們建立訪問資料庫需要的連線指令 Adapter 引數許可權資料來源等等

DbProviderFactories methods

DbProviderFactories Method

Purpose

GetFactoryClasses()

Returns a DataTable of provider information from the information in machine.config

GetFactory(DataRow)

Returns the correct DbProviderFactory instance given a DataRow from the DataTable produced by GetFactoryClasses

GetFactory(string)

Returns the correct DbProviderFactory instance given a provider-invariant name string that identifies the provider

GetFactory(string):這裡面string 你把可以把它寫到配置檔案(machine.config)

註冊資料提供者

ADO.NET 2.0 可以在machine.config來註冊資料提供者,在程式中可以按名字找到相應

資料提供者。通過下面的註冊,當我要用SqlClient Data Provider就只知道是用這個類來實現的

<system.data>

<DbProviderFactories>

<addname="SqlClient Data Provider"invariant="System.Data.SqlClient"support="FF"description=".Net Framework Data Provider for SqlServer"

type="System.Data.SqlClient.SqlClientFactory, System.Data,Version=2.0.3600.0, Culture=neutral,PublicKeyToken=b77a5c561934e089" />

<!-- other provider entries elided -->

</DbProviderFactories>

</system.data>

Factory例子(base

enum provider {sqlserver, oracle, oledb, odbc};

public DbConnection GetConnectionBaseClass()

{

// determine provider from configuration

provider prov = GetProviderFromConfigFile();

DbConnection conn = null;

switch (prov)

{

case provider.sqlserver:

conn = new SqlConnection();

break;

case provider.oracle:

conn = new OracleConnection();

break;

// add new providers as the application supports them

}

return conn;

}

為什麼能夠這樣實現呢?這是因為ADO.NET2.0中的DBConenection抽象類,而在ADO.NET1.1中只有IConnenction這個介面

Factory例子(Adv

// get ProviderInvariantString from configuration

string provstring = GetProviderInvariantString();

DbProviderFactory fact = DbProviderFactories.GetFactory(provstring);

IDbConnection = fact.CreateConnection();

以上兩種方式都能夠實現DataProvider

資料庫連線

連線

l在方法中開啟和關閉連線明確地關閉連線。

l當使用DataReaders, 指定CommandBehavior.CloseConnection

l當使用FillUpdate方法時,不要手工開啟連線。

l避免檢查OleDbConnection State屬性,帶來額外的消耗。

l使用連線池

連線池

在預設情況下,連線池自動開啟。可以通過連線字串的引數控制連線池:

Max Pool Size (default = 100)

Min Pool Size (default = 0)

Pooling (default = true)

Conn.ConnectionString="Server=localhost; Integrated Security=SSPI; Database=Northwind;Max Pool Size=75; Min Pool Size=5;Pooling=true;";

開啟和關閉連線

lDataAdapter能根據需要自動開啟和關閉連線。

l使用Command物件時,則需要手動開啟和關閉連線

SQL指令

l校驗SQL的輸入並使用引數

l僅返回需要的行和例

l對大的資料集使用分頁功能

l批次執行SQL ,減少往返

l如果沒有資料返回則使用ExecuteNonQuery方法

l當返回一個標量時,使用ExecuteScalar方法

l不要在執行時間使用CommandBuilder

批次執行SQL

SqlCommand cmd = new SqlCommand();

cmd.CommandText = "ReadCustomerAndOrders";

// The stored procedure returns multiple result sets.

SqlDataReader myReader = cmd.ExecuteReader();

if (myReader.read())

//... read first result set

reader.NextResult();

if (myReader.read())

//... read

儲存過程

l儘量使用儲存過程

一般SQL語句需要執行五步:解釋解析優化編譯執行,所以儲存過程只需要執行最後一步

l對於OleDbCommand,指令型別為CommandType.Text

l使用SqlCommand時,指令型別為CommandType.StoredProcedure

l考慮使用Command.Prepare(),這是因為在後臺做一個編譯儲存起來

l儘可能使用輸出引數

l考慮在SQL ServerSET NOCOUNT ON。我們可以從查詢分析器中可以看見沒做一次執行,都會給一個統計反映多少行修改,我們可以把它關閉,使SQL語句執行更快。

引數

l在儲存過程上使用引數

SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin", conn);

myCommand.SelectCommand.CommandTyp

e = CommandType.StoredProcedure;

SqlParameter parm=myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);

parm.Value = Login.Text;

l使用引數化SQL語句

SqlDataAdapter myCommand = new SqlDataAdapter SqlDataAdapter("SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", conn);

SqlParameter parm = myCommand.SelectCommand.Parameters.Add("@au_id",SqlDbType.VarChar, 11);

parm.Value = Login.Text;

l建立引數並指定型別

l可將引數物件進行快取

事務

l使用資料庫事務(儲存過程)

BEGIN TRAN

UPDATE Orders SET [email protected] Where [email protected]

UPDATE [Order Details] SET [email protected] Where [email protected]

IF (@@ERROR > 0)

ROLLBACK TRANSACTION

ELSE

COMMIT TRANSACTION

[注意]如果你的事務判斷條件都在資料庫裡面,就考慮使用資料庫事務,它的效率最高

l使用ADO.NET的事務(程式設計)

SqlConnection conn = new SqlConnection(connString);

SqlTransaction trans = conn.BeginTransaction();

try

{

SqlCommand cmd = new SqlCommand("MyWriteProc",conn, trans);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add(.......);

// additional transactioned writes to database

trans.Commit();

}

catch

{

trans.Rollback();

}

l使用分散式事務,由多個數據庫的更新,考慮分散式事務,雖然效率很差。

l儘可能使用短事務,這是因為資源鎖定的時間比較長。

l使用適當的事務隔離級別,避免併發行很差。

l避免死鎖

 

相關推薦

[ASP.NET學習筆記]開發高效能ADO.NET應用

開發高效能的ADO.NET應用 ADO.NET概述 面向連線模型 lADO.net 1.x讀取資料時必須儲存穩定的連線而且在每個連線上只能使用一個DataReader。 lADO.net 2.0無此限制!一個連線可以開啟多個DataReader ADO.NET效能最佳

.NET學習筆記ADO.NET

技術分享 reader sql語句 bsp 技術 area ada 執行sql 學習 據提供程序: Connection,用來連接數據庫 Command,用來執行SQL語句 DataReader只讀,只進的結果集,一條一條讀取數據 DataAdapter,一個封裝了上面3個

,NET學習筆記ADO.NET

nbsp png alt 學習 log logs ima http blog ,NET學習筆記之ADO.NET

ceph學習筆記 數據讀寫過程

ceph sds 數據寫過程1、Client向PG所在的主OSD發送寫請求。2、主OSD接收到寫請求,同時向兩個從OSD發送寫副本的請求,並同時寫入主OSD的本地存儲中。3、主OSD接收到兩個從OSD發送寫成功的ACK應答,同時確認自己寫成功,就向客戶端返回寫成功的ACK應答。4、在寫操作的過程中,主

Memcached學習筆記:memcached高可用叢集原理及介紹

首先我要宣告的是為什麼叫分散式叢集? 因為我們要達到的目的是要把快取放到2臺搭建在不同的伺服器上面的memcached,所以我們如果兩個memcached中放的是一樣的資料,那麼就是叢集,如果是根據業務不同而放不一樣的資料就是分散式! memcached在實現分散式群集部署時,memcached

Nordic nRF5 SDK 學習筆記, POWER PROFILER KIT (PPK) 用法

NORDIC POWER PROFILER KIT (PPK):用於嵌入式開發的電流測量工具; 實時測量微功耗的控制板及軟體系統! 官方資料連結 產品介紹 https://www.nordicsemi.com/chi/node_176/Power-Profiler-Kit

SpringSecurity學習筆記:保護檢視

Spirng Security本身提供了一個JSP標籤庫,而Thymeleaf通過特定的方言實現了與Spring Security的整合。 Spring Security的JSP標籤庫很小,只包含是三個標籤: 為了使用JSP標籤庫,需要在JSP中宣告它: 訪問認證資訊的

轉發:Zynq-Linux移植學習筆記-netperf網路測試

1、netperf安裝 目前linux下主流的網路測試工具是netperf,完全可以在zc706上執行的linux內加入netperf網路測試工具,然後用網線與電腦相連進行測試。 netperf下載地址:netperf下載地址 Client端安裝 下載結束後,進行安裝:

機器學習筆記——梯度下降推導BGD、SGD、MBGD

BGD(批梯度下降,又稱全量梯度下降)為標準梯度下降套路,但是速度慢,每一次更新引數Θ都需要遍歷所有樣本。 SGD(隨機梯度下降)求速度,每一次更新引數Θ只去遍歷一個樣本。 MBGD(小批量梯度下降)取兩者中庸,每次更新Θ,取一部分樣本來遍歷。 具體解釋如下:   

CSharp學習筆記

眾所周知,C#是一種面向物件的語言。對於面嚮物件語言,所具備的特徵就是抽象、繼承、封裝、多型。 抽象:所謂的抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個

unity3D學習筆記 Material(材質)的幾種RenderingMode(渲染模式)

起因: 換裝時為了平滑地從一種材質切換到另一種材質,可以考慮使用一種發光特效的動畫覆蓋,也可以淡入淡出(設定Alpha)。當我考慮使用淡入淡出的方案時,發現設定Alpha並無效果,後來看了Material的手冊時發現了RendereringMode屬性。

C#學習筆記 類定義中static關鍵字的用法暨C#中靜態變數的意義與使用

<span style="font-size:18px;">using System; namespace MakeoutStatic { class Counter { public static int num; public void clear() { num = 0;

Shiro學習筆記()Apache Shiro 會話管理

一、獲取session    Shiro 中獲取session方法比較簡單二、SessionManager      SessionManager為subject提供session管理,包括建立,刪除,失效,驗證等。SessionManager預設實現DefualtSessi

VB.net學習筆記)VB.net的物件

1、System.Object        每個變數、控制元件、窗體都繼承了System.Object 2、物件的宣告與例項化      簡單說宣告,只是說明型別,例項化說明在記憶體中分配了空間。       用New來建立物件,得到類的一個新例項      

php 學習筆記搭建開發環境(mac版)

Mac 系統預設集成了很多開發工具,其中就包括 php 所需要的一些軟體工具. 下面我們將搭建最簡單的 php 開發環境,每一步都會驗證上一步的操作結構,請一步一步跟我一起搭建吧! web 伺服器之 apache apache 是一款 web 伺服器,用於執行 php 檔案,除了 apache 外也可以是 n

Vue.js 學習筆記:構建更復雜的元件

在掌握瞭如何構建與編譯 Vue 元件的基礎知識之後,接下來就可以試著來構建一些更具有實際用處的複雜元件了。為了賦予元件更具實用性的後面,首先要做的就是讓這些元件具備監聽使用者自定義事件的能力,並且允許使用者為這些自定義事件註冊相應的處理函式,而這一切都要從`v-on`指令在 Vue 元件中的使用說起。 ##

Java學習筆記抽象類與介面的應用

1、抽象類的實際應用 — 定義模板 假設有這樣的場景,將人分為工人和學生,兩者都能說話,只是說話的內容不一樣,換句話說,說話這個功能應該是一個具體功能,說話的內容由學生和工人決定,我們可以用抽象類實現這個場景 abstract class Person2{ private S

ASP.NET Core 2 學習筆記)MVC

方便 web redirect AR return his 架構模式 PE ofo 原文:ASP.NET Core 2 學習筆記(六)MVC ASP.NET Core MVC跟ASP.NET MVC觀念是一致的,使用上也沒有什麽太大的變化。之前的ASP.NET MVC把MV

嵌入式核心及驅動開發學習筆記) 驅動層中斷實現

由於中斷訊號的突發性,CPU要捕獲中斷訊號,有兩種方式。一是不斷輪詢是否有中斷髮生,這樣有點傻;二是通過中斷機制,過程如下: 中斷源 ---> 中斷訊號  --->  中斷控制器 --->  CPU  中斷源有很多,CPU拿

床頭筆記Android開發學習

初識Acitivity 目錄: 認識acitivity 建立一個acitivity專案 新增控制元件,實現想要的功能及介面 認識acitivity: Activity 是一個應用元件。 每個 Activity 都會獲得一個用於繪製其使用者介面的視窗。 使用者