如何在 c# 中减少项目中的数据库连接数
本文关键字:项目 数据库连接 | 更新日期: 2023-09-27 18:33:32
我是c#的新手,使用Windows表单。
我正在构建一个包含大约 25 个Forms
和 25 个user controls
的项目,每个项目都Forms
,user controls
使用 SQL 数据库从数据库中读取数据(请注意,我在 app.config
文件中使用连接字符串(。
如代码所示,我总是将 sql 查询放在 50 个 Form/user 控件构造函数中,以从数据库中读取数据(例如控件文本和其他内容(;
我的程序运行良好,没有问题,但想象一下,当我运行该程序时,所有 25 forms
和 25 user controls
将"同时"查询数据库,这让我觉得我做错了什么,它可能会在我的程序后面产生副作用。
我不知道将查询放入构造函数(例如按钮文本查询(是否正确?另外,我觉得 25 Forms
和 25 user controls
在运行时同时攻击 SQL 数据库,那么有没有办法减少与数据库的连接数?请指导我。谢谢
public partial class SubMenu1 : UserControl
{
SqlConnection MyConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
SqlCommand MyCommand = new SqlCommand();
DataTable DataTable = new DataTable();
SqlDataAdapter Sql_Data_Adapter = new SqlDataAdapter();
public SubMenu1()
{
InitializeComponent();
DataTable.Rows.Clear();
DataTable.Columns.Clear();
MyConnection.Open();
MyCommand.CommandText = "SELECT * FROM Table21 ";
MyCommand.Connection = MyConnection;
Sql_Data_Adapter.SelectCommand = MyCommand;
Sql_Data_Adapter.Fill(DataTable);
MyConnection.Close();
}
public void MyFunction()
{
// Do some stuff with the DataTable ...
}
}
你的代码有很多问题。首先不要使用全局连接,有连接池。
连接池减少了新连接的次数 必须打开。池处理器维护物理的所有权 连接。它通过保持一组活动状态来管理连接 每个给定连接配置的连接。每当用户 调用 在连接上打开,池程序查找可用的 池中的连接。如果池连接可用,则 将其返回给调用方,而不是打开新连接。当 应用程序调用 关闭连接,池程序将其返回到 活动连接的池化集,而不是关闭它。一旦 连接返回到池中,可以在 下一个打开调用。
此外,您应该在使用或尝试/捕获/最终阻止中使用连接。这是必需的,因为如果发生某些异常,连接将永远不会Closed
,这将在您尝试重用它时导致异常,或者它永远不会返回到连接池。
同样,SqlDataAdapter 应该包装在 using 块中,您需要在完成使用它的工作后关闭适配器。您需要调用 Dispose
,以便 SqlAdapter 释放组件使用的所有资源。这是每个IDisposable
对象的规则。如果不处置它,则处置将在 GC 终结器上进行,但何时执行由 GC 决定。因此,不处理此对象可能会产生很高的成本。这里是 msdn 中关于 IDisposable 的文章
我建议您创建单独的数据访问层,我在这个问题中做了一个简单的来显示设计问题:检查用户名或用户电子邮件是否已存在
如果您不希望单独的层用于数据访问,则代码应如下所示:
public partial class SubMenu1 : UserControl
{
public SubMenu1()
{
InitializeComponent();
}
public void MyFunction()
{
DataTable dataTable = new DataTable();
using(SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
using(SqlDataAdapter sqlDataAdapter = new SqlDataAdapter())
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand();
myCommand.CommandText = "SELECT * FROM Table21";
myCommand.Connection = myConnection;
sqlDataAdapter.SelectCommand = myCommand;
sqlDataAdapter.Fill(dataTable);
}
if(dataTable.Rows.Count > 0)
{
//do stuff ....
}
}
}
使用静态连接成员创建类。所有窗体/控件都将获得此连接并使用它。在应用关闭时关闭此连接。