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

[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可以比較好找到問題發生的網頁。

 

 

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

 

 

如果您有微軟技術開發的問題,可以到MSDN Forum發問。

如果您有微軟IT管理的問題,可以到TechNet Forum發問喔。