如何在 c# 中减少项目中的数据库连接数

本文关键字:项目 数据库连接 | 更新日期: 2023-09-27 18:33:32

我是c#的新手,使用Windows表单。

我正在构建一个包含大约 25 个Forms和 25 个user controls的项目,每个项目都Formsuser 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 ...
    }

  }

如何在 c# 中减少项目中的数据库连接数

你的代码有很多问题。首先不要使用全局连接,有连接池。

连接池减少了新连接的次数 必须打开。池处理器维护物理的所有权 连接。它通过保持一组活动状态来管理连接 每个给定连接配置的连接。每当用户 调用 在连接上打开,池程序查找可用的 池中的连接。如果池连接可用,则 将其返回给调用方,而不是打开新连接。当 应用程序调用 关闭连接,池程序将其返回到 活动连接的池化集,而不是关闭它。一旦 连接返回到池中,可以在 下一个打开调用。

此外,您应该在使用或尝试/捕获/最终阻止中使用连接。这是必需的,因为如果发生某些异常,连接将永远不会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 ....
         }
     }
}

使用静态连接成员创建类。所有窗体/控件都将获得此连接并使用它。在应用关闭时关闭此连接。