在整个应用程序时间内保持与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文本编辑器编写),但我认为它们展示了必要的哲学。
因此,第一个示例将在每次调用时打开和关闭连接。第二个示例将保持连接打开更长的时间。
在您看来,什么是"一般"最佳实践?
我建议尽快处理任何非托管资源,正如您在示例中所概述的那样。垃圾收集最终会到达那里,但为什么要等待呢?这里的综合答案:正确使用IDisposable接口
特别是对于SQL服务器,连接池有一个连接上限,可以是默认连接,也可以是在连接字符串中定义的连接。如果不关闭打开的连接,则会耗尽池中的水。
同意James Thorpe的意见,即这可能取决于创建资源的成本,但您指定的示例(数据库连接、web服务调用)不应该特别昂贵