我需要确保应用程序使用到数据库的最小连接数

本文关键字:数据库 连接 确保 应用程序 | 更新日期: 2023-09-27 18:28:01

认证考试的问题:

您可以使用Microsoft Visual Studio 2010和Microsoft.NET Framework 4来创建应用程序。该应用程序包含以下代码段。(线路编号仅供参考。)

01  class DataAccessLayer
02  {
03    private static string connString;
04
05    ...
06    public static DataTable GetDataTable(string command){
07
08      ...
09    }
10  }

您需要定义DataAccessLayer类的连接生命周期。您还需要确保应用程序使用到数据库的连接数最少。你该怎么办?

[A] 在第04行插入以下代码段。

private static SqlConnection conn = new SqlConnection(connString);
public static void Open(){
  conn.Open();
}
public static void Close(){
  conn.Close();
}

[B] 在第04行插入以下代码段。

private SqlConnection conn = new SqlConnection(connString);
public void Open(){
  conn.Open();
}
public void Close(){
  conn.Close();
}    

[C] 将第01行替换为以下代码段。

class DataAccessLayer : IDisposable 

在第04行插入以下代码段。

private SqlConnection conn = new SqlConnection(connString);
public void Open(){
  conn.Open();
}
public void Dispose(){
  conn.Close();
}

[D] 在第07行插入以下代码段。

using (SqlConnection conn = new SqlConnection(connString)){
  conn.Open();
}    

有些人认为正确答案是[D],但从我的角度来看,这是没有意义的,因为连接在"使用"块之后被打开并立即关闭

有人能指出正确答案并解释原因吗?

谢谢!!!

我需要确保应用程序使用到数据库的最小连接数

无是正确答案。

  • A-C是错误的,因为他们不处理异常
  • C也是错误的,因为您希望在返回DataSet的方法中封装数据访问。数据集是断开连接的,没有迹象表明你正在做任何需要类在方法调用之间保持开放连接的事情,所以没有理由让整个类保持连接。只需在每个进行DB调用的方法中执行即可
  • D很接近,但错了。要解决此问题,请在using(){…}块内的conn.Open()调用之后添加数据访问代码

注意:我不确定你是否没有把数据访问代码放在D.Open()调用之后。如果你认为这是可以理解的,那么D实际上是正确的答案。当连接被释放时,它会被释放回连接池中。连接池将帮助您最大限度地减少打开的连接数。如果你需要关闭连接,即使它们处于非活动状态,你也需要开始考虑配置连接池的使用。

D实现using关键字,该关键字作用域为代码的一部分,并将被处理为implicity。

A、 B、C仍然处于类/程序级别的生命周期中,因此每个实例将跨越另一个连接。

D是正确的。您只能使用一个连接。至少,你希望如此。ADO.NET具有连接池功能,除非使用解决方案A(一个静态分配的连接),否则您无法完全确定发生了什么。

由于您应该尽可能多地使用连接池,因此D仍然是正确的连接池。