vb.net - 连接池真的能提高整体性能吗?
问题描述
每次我有一个新的插入时,我在 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 上执行此操作?
解决方案
是的,池连接确实更快。它们使您无需不断地重新协商登录和协议信息。更好的是,这已经内置到SqlConnection
类型中,并且以合理的线程安全方式完成(现有代码不是)。
简短的版本是您确实希望为大多数查询创建一个全新的连接对象,并且您不想尝试在整个应用程序或会话中共享相同的连接变量。
鉴于此,我在该代码中看到了几个大问题:
- 将类级
_conn
变量视为本地变量,从而无法跨线程安全地共享此类的实例。 - 如果抛出异常,则没有清理连接的机制(需要一个
Finally
或Using
块。只是在之后关闭Catch
还不够好。 - 无法在函数签名中传递单独的查询参数。这将迫使您在其他地方编写非常不安全的代码,这些代码很容易受到 sql 注入攻击。这是一种你一天早上醒来发现你在一年前被黑客入侵的事情,而 IMO 近乎专业的渎职行为。
- 将 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
推荐阅读
- java - 为什么 JDK 中的一些可比较类将比较函数限制为 {−1, 0, 1} 而有些则没有?
- node.js - 使用 AWS Lambda 进行 Fastify
- java - 代表团被拒绝
在 Gmail API 中 - python - 按下按钮时导入和使用 mp3
- tensorflow - TensorFlow 降低保存模型的学习率
- flutter - 在轮播滑块中显示两个项目
- nativescript - iOS 14 上的部署失败(Svelte Native,Xcode 12)
- javascript - 使用 Node.js、Mongoose 和 Discord.js 的未定义错误 [无法读取未定义的属性]
- java - 在spring boot rest api控制器中调用单例类
- c++ - 使用模板逻辑在运行时从基类转换为派生类