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

时间:2012-03-17 00:48:48

标签: c# ado.net data-access-layer

认证考试的问题:

您使用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],但从我的观点来看,这是没有意义的,因为连接正在打开并在“使用”块之后立即关闭。

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

感谢!!!

3 个答案:

答案 0 :(得分:1)

没有正确答案。

  • A-C是错误的,因为它们不处理异常。
  • C也是错误的,因为您希望从返回DataSet的方法中封装数据访问。数据集已断开连接,并且没有任何迹象表明您需要类在方法调用之间保持打开连接,因此没有理由让整个类保持连接。只需在每个进行数据库调用的方法中执行此操作。
  • D很接近,但错了。要修复它,请在conn.Open()调用之后,在using(){...}块内添加数据访问代码。

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

答案 1 :(得分:0)

D实现using关键字代码的范围部分,并将被隐瞒。

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

答案 2 :(得分:0)

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

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