2012-11-26 55 views
2

我使用此代碼來獲取數據:SqlDataReader的vb.net保持連接開放

Dim connetionString As String 
    Dim connection As SqlConnection 
    Dim sqlq As String 

    sqlq = "select top 1 * from table1 where smth" 

    Dim ds As New DataSet 
    connetionString = "Data Source=db;Initial Catalog=ic;User ID=id;Password=pass" 
    connection = New SqlConnection(connetionString) 

    Try 
     Using connection 
      Dim command As SqlCommand = New SqlCommand(sqlq, connection) 
      connection.Open() 
      Dim reader As SqlDataReader = command.ExecuteReader() 
      If reader.HasRows Then 
       Do While reader.Read() 
        x = reader.GetString(5) 
       Loop 
      End If 
      reader.Close() 
     End Using 
    Catch ex As Exception 
    End Try 

這種類型的連接(具有不同sqlq [查詢])我在diffenrent功能,每次我關閉時間用了很多連接。我想優化它,因此獲取數據所需的時間會更少。我怎麼做?

+2

這是一個非常糟糕的主意。做**不**保持數據庫連接的打開時間超過您絕對**的需要。最佳做法是:*儘可能晚*開放**,儘快完成工作,儘快結束**再次儘可能*。 –

+1

我打算只要應用程序正在運行,以保持連接打開,因爲我需要儘快獲取數據,這裏的時間非常重要。 – babboon

+0

正如我所說:這是一個**非常糟糕的主意** - 不要這樣做。認真。 –

回答

5

最好的做法是在您完成後始終處理/關閉連接。實際上,connection-pool將不會關閉底層的物理連接,但只會將此連接標記爲,如果已關閉,則可重複使用。所以如果你沒有關閉連接就不能重用,因此池需要創建一個新的物理連接,這是非常昂貴的。

所以只有一些微小的改進:

Const sql = "select top 1 * from table1 where smth" 
Dim table As New DataTable() 

Using con = New SqlConnection("Data Source=db;Init ....") 
    Using command = New SqlCommand(sql, con) 
     Using da= New SqlDataAdapter(command) 
      da.Fill(table) 
     End Using 
    End Using 
End Using 

您應該使用Using實施IDisposable任何對象。您不應該使用空的Catch塊。

3

改爲使用connection pooling

默認情況下,只要連接字符串相同,連接將取自同一個連接池。

短暫的連接池不需要連接打開,並在下一個請求中返回連接,因此您不需要考慮打開連接所用的時間。

保持連接打開比您需要的時間更長是個壞主意,因爲它會花費資源,並且通常一些服務器可以接受有限的連接。

+2

_「使用連接池代替」_有點讓人誤解,因爲默認情況下在ADO.NET中啓用了連接池。 –

+1

同意,這是默認情況下,我的意思是不要關閉! :) –