首页 > 解决方案 > 连接池真的能提高整体性能吗?

问题描述

每次我有一个新的插入时,我在 Visual Basic 中有这段代码:

Private _conn As SqlConnection 

Public Function Include(ByVal pSql As String, Optional timeout As Integer = 120) As Boolean
   Try
        Dim SQL_Str = "my string of conection... with database. not put on this example"
        _conn = New SqlConnection(SQL_Str)
        _conn.Open()

        _adapter = New SqlDataAdapter

        cmd.CommandTimeout = timeout
        cmd.Connection = _conn
        cmd.CommandText = pSql
        cmd.CommandType = CommandType.Text

        _adapter.InsertCommand = cmd

        _adapter.InsertCommand.ExecuteNonQuery()

    Catch ex As Exception
        InputBox("New Error on Sql cmd: ", , pSql)
    End Try

     _conn.Close()
     _conn.Dispose()
     _conn = Nothing

    _adapter.Dispose()
    _adapter = Nothing
End Function

好的,这是更新数据库的直接方法。

但是假设我同时有 1000 个连接,应用程序会支持这种方法吗?

此方法是否支持同时访问 _conn 对象的线程?

真的有必要创建一个连接池来处理数据吗?

连接池真的会改善一些事情吗?

例如,我正在重载应用程序而不是数据库?

如果是这样,我将如何在 VbNet/Visual Basic 上执行此操作?

标签: vb.netconnection-pooling

解决方案


的,池连接确实更快。它们使您无需不断地重新协商登录和协议信息。更好的是,这已经内置到SqlConnection类型中,并且以合理的线程安全方式完成(现有代码不是)。

简短的版本是您确实希望为大多数查询创建一个全新的连接对象,并且您不想尝试在整个应用程序或会话中共享相同的连接变量。

鉴于此,我在该代码中看到了几个大问题:

  1. 将类级_conn变量视为本地变量,从而无法跨线程安全地共享此类的实例。
  2. 如果抛出异常,则没有清理连接的机制(需要一个FinallyUsing块。只是在之后关闭Catch还不够好。
  3. 无法在函数签名中传递单独的查询参数。这将迫使您在其他地方编写非常不安全的代码,这些代码很容易受到 sql 注入攻击。这是一种你一天早上醒来发现你在一年前被黑客入侵的事情,而 IMO 近乎专业的渎职行为。
  4. 将 UI 代码与实用程序代码混合。

你想要更像这样的东西:

Private cnString As String = "my string of conection... with database. not put on this example"

Public Sub Include(pSql As String, parameters() As SqlParamter, Optional timeout As Integer = 120)
   Using conn As New SqlConnectioN(cnString), _
         cmd As New SqlCommand(pSql, conn)

        If parameters IsNot Nothing AndAlso parameters.Length > 0 Then
            cmd.Parameters.AddRange(parameters)
        End If

        conn.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub

你可能会这样称呼它(假设类型或实例名称是DB):

Dim pSql As String = "INSERT INTO [ExampleTable] (FirstName, LastName, CreationDate) VALUES (@FirstName, @LastName, @CreationDate)"
Dim parameters = {
    New SqlParameter("@FirstName", SqlDbType.NVarChar, 20),
    New SqlParameter("@LastName", SqlDbType.NVarChar, 20),
    New SqlParameter("@CreationDate", SqlDbType.DateTime)
}
parameters(0).Value = "John"
parameters(1).Value = "Smith"
parameters(2).Value = DateTime.Now

Try
    DB.Include(pSql, parameters)
Catch ex As Exception
    MessageBox.Show(String.Format("New Error on Sql cmd:{0}{1}{0}{0}Message:{2}",vbCrLf, pSql, ex.Message)
End Try

推荐阅读