【问题标题】:I need to ensure that the application uses the minimum number of connections to the database我需要确保应用程序使用最少的数据库连接数
【发布时间】:2012-04-02 12:40:21
【问题描述】:

认证考试中的问题:

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

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

谢谢!!!

【问题讨论】:

  • 你是对的,一旦 using 块退出,D 将调用 ((IDisposable)conn).Dispose()。
  • 原来的代码示例是不完整的,所以答案也是。这个想法是您将 using 语句插入 GetDataTable 方法,然后在该 using 语句中调用必要的 db 命令并返回数据表。您认为它没有意义的论点是无效的,因为假设数据访问代码将位于 using 语句的右大括号之前。

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


【解决方案1】:

没有一个是正确的答案。

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

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

【讨论】:

  • 好的。这个问题必须有一个正确的选择。所以我会假设问题中有一个“错字”,并且在 conn.Open() 之后是数据访问代码。
【解决方案2】:

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

既然要尽量使用连接池,那么D还是正确的。

【讨论】:

    【解决方案3】:

    D implementusing 关键字将被隐式处理的代码范围部分。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 2014-11-15
      相关资源
      最近更新 更多