2009年4月30日

[KB]如何讓DBA精準的掌握效能不好的網頁?

身為一個DBA,最痛恨的應該是知道某個網站效能不好,但是又苦於無法找出這個麻煩的網頁。

那要怎麼作才能達到這個需求?

 

在連線字串中,可以透過設定Applicaion Name,然後在SQL Profiler查到一些相關資訊:

1.

還沒加Application Name之前:

image

 

你會發現,當網頁連接時,Application Name因為是透過.Net SqlClient Data Provider來作連結,所以這邊顯示就是「.Net SqlClient Data Provider」。

 

2.

如果在連線字串(ConnectionString)加上Application Name呢?

"Data Source=localhost;Initial Catalog=MyTest;Integrated Security=True;Application Name=ERP"

image

 

只要在連線字串簡單的加上Application Name=系統名稱,SQL Server的DBA就可以比較輕鬆的找到發生問題的系統。

 

 

但是,如果想要更明白的知道是那個網頁發生問題,要怎麼處理?

   1:    Dim connStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("MyTestConnectionString").ConnectionString


   2:   


   3:    Dim conn As New System.Data.SqlClient.SqlConnection(connStr & "&Page=Default")


   4:    Dim cmd As New System.Data.SqlClient.SqlCommand("SELECT * FROM [T1]", conn)


   5:    Dim da As New System.Data.SqlClient.SqlDataAdapter(cmd)


   6:    Dim dt As New Data.DataTable


   7:   


   8:    da.Fill(dt)


   9:   


  10:    GridView1.DataSource = dt


  11:    GridView1.DataBind()





在連線字串的處理中,我們多加了一個這個網頁的名稱,然後在SQL Server Profiler中就可以看到:



image



 



那如果是用DataSource當來源呢? 我們可以去它的selecting事件中處理(如果是Insert、Update、Delete事件,請在對應事件處理)




   1:   Protected Sub SqlDataSource1_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SqlDataSource1.Selecting


   2:          e.Command.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings("MyTestConnectionString").ConnectionString & "&PageIsDefault"


   3:   


   4:  End Sub




 



image



 



那如果是用強型別的SQLDataAdapter呢?



可以透過Partial Class去處理:




   1:  Namespace DataSet1TableAdapters


   2:      Partial Class T1TableAdapter


   3:          Private _conn As System.Data.SqlClient.SqlConnection


   4:          Public Property MyConnStr() As System.Data.SqlClient.SqlConnection


   5:              Get


   6:                  Return _conn


   7:              End Get


   8:   


   9:              Set(ByVal value As System.Data.SqlClient.SqlConnection)


  10:                  Me._conn = value


  11:                  For Each cmd As Data.SqlClient.SqlCommand In Me.CommandCollection()


  12:                      If cmd IsNot Nothing Then


  13:                          cmd.Connection = _conn


  14:   


  15:                      End If


  16:                  Next


  17:                  If Me.Adapter.InsertCommand IsNot Nothing Then


  18:                      Me.Adapter.InsertCommand.Connection = _conn


  19:   


  20:                  End If


  21:                  If Me.Adapter.UpdateCommand IsNot Nothing Then


  22:                      Me.Adapter.UpdateCommand.Connection = _conn


  23:   


  24:                  End If


  25:                  If Me.Adapter.DeleteCommand IsNot Nothing Then


  26:                      Me.Adapter.DeleteCommand.Connection = _conn


  27:   


  28:                  End If


  29:              End Set


  30:          End Property


  31:      End Class


  32:  End Namespace





然後頁面上這樣呼叫:




   1:  Dim da As New DataSet1TableAdapters.T1TableAdapter


   2:    da.MyConnStr = New System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("MyTestConnectionString").ConnectionString & "&StrongPageIsDefault")


   3:   


   4:  GridView1.DataSource = da.GetData()


   5:  GridView1.DataBind()





 



image



 



 



透過這種方式,雖然在開發上會麻煩一點,但是在後續的管理上,可是會輕鬆許多,讓公司的SQL Server DBA可以比較好找到問題發生的網頁。



 



 



希望以上的資訊對您有所幫助。 ^^

沒有留言:

張貼留言

[Info] 如何快速找到Fix it?

  台灣微軟目前提供了很多的Fix it,讓許多消費者可以不用看完整篇KB,只要按下一個按鈕,就可以幫使用者自動修正許多問題. 現在在Vista以及Windows 7上,微軟也提供了SideBar工具,讓你用最短的時間找到能修正您的電腦的Fix it.(目前為英文版本) ...