在整个应用程序时间内保持与web服务的连接处于打开状态

本文关键字:服务 web 连接处 状态 于打开 应用程序 时间 | 更新日期: 2023-09-27 18:24:16

我有一个关于"最佳实践"的问题。如果这个问题没有建设性,那就投票否决吧:)

几天前,我与一位同事进行了一次讨论,当谈到与web服务、COM对象、数据库等的开放连接的最佳实践时,我们有两种完全不同的哲学。

我更喜欢将连接代码封装在一个实现IDisposable的类中,并让它处理所有连接等。

    public class APIWrapper : IDiposable
    {
          public APIWrapper(...)
          {
              DataHolder = new DataHolder(...);
              /// Other init methods
              Connect();
          }
          public [Webservice/Database/COM/etc.] DataHolder { get; private set; }
          public void Connect()
          {
              DataHolder.Connect(...);
          }
          public void Disconnect()
          {
              DateHolder.Disconnect();
          }
          public void Dispose()
          {
              Dispose(true);
              GC.SuppressFinalize(this);
          }
          private void Dispose(bool disposing)
          {
              if(disposing)
              {
                  if (DataHolder != null)
                  {
                      Disconnect();
                      DataHolder = null;
                  }
              }
          }
    }

我会在我的数据控制器中像这样使用它。

    public class UserController
    {
          ....
          public IList<User> getUsers()
          {
              using(APIWrapper datalayer = new APIWrapper(...))
              {
                  var users = datalayer.DataHolder.GetUsers();
                  /// Map users to my enity of users
                  return mappedUsers;
              }
          }
    }

我的同事会是这样的:

    public class UserController
    {
         protected [Webservice/Database/COM/etc.] DataHolder { get; set; }
          public UserController()
          {
              DataHolder = new DataHolder(...);
              DataHolder.Connect(...);
          }
          public IList<User> getUsers()
          {
              var users = DataHolder.GetUsers();
              /// Map users to my enity of users
              return mappedUsers;
          }
          /// Who should call this?
          public void Dispose()
          {
              DataHolder.Disconnect();
          }
    }

上面的代码只是简化的示例(由stackoverflow文本编辑器编写),但我认为它们展示了必要的哲学。

因此,第一个示例将在每次调用时打开和关闭连接。第二个示例将保持连接打开更长的时间。

在您看来,什么是"一般"最佳实践?

在整个应用程序时间内保持与web服务的连接处于打开状态

我建议尽快处理任何非托管资源,正如您在示例中所概述的那样。垃圾收集最终会到达那里,但为什么要等待呢?这里的综合答案:正确使用IDisposable接口

特别是对于SQL服务器,连接池有一个连接上限,可以是默认连接,也可以是在连接字符串中定义的连接。如果不关闭打开的连接,则会耗尽池中的水。

同意James Thorpe的意见,即这可能取决于创建资源的成本,但您指定的示例(数据库连接、web服务调用)不应该特别昂贵