在ASP.NET 5中共享跨POCO的Db连接(vNext)

时间:2015-05-24 15:06:02

标签: asp.net database

我正在学习如何使用ASP.NET 5(vNext)。为了做到这一点,我正在研究一个基本的应用程序。在这个应用程序中,我试图使用Dapper从几个POCO(客户,订单等)连接到数据库。如果我理解正确,那么创建,连接和拆除与数据库的连接的成本很高。如果这是真的,我试图找出在多个对象之间共享连接的推荐方法。

目前,我有以下内容:

public class Order
{
  private IDbConnection _connection;
  public void Save()
  {
    using (_connection = new SqlConnection("[MyConnectionString]")
    {
      _connection.Open();
      _connection.Execute("[INSERTION SQL]");
    }
  }

  public List<Order> FindByCustomerEmailAddress(string emailAddress)
  {
    using (_connection = new SqlConnection("[MyConnectionString]")
    {
      _connection.Open();
      return _connection.Query<List<Order>>("SELECT o.* FROM Order o, Customer c WHERE o.CustomerId=c.CustomerId AND c.EmailAddress='" + emailAddress + "'" );    
    }
  }
}

public class Customer
{
  private IDbConnection _connection;
  public void Save()
  {
    using (_connection = new SqlConnection("[MyConnectionString]")
    {
      _connection.Open();
      _connection.Execute("[INSERTION SQL]");
    }
  }

  public Customer FindByEmailAddress(string emailAddress)
  {
    using (_connection = new SqlConnection("[MyConnectionString]")
    {
      _connection.Open();
      return _connection.Query<Customer>("SELECT * FROM Customer WHERE EmailAddress='" + emailAddress + "'" );    
    }
  }
}

我考虑创建一个看起来像这样的Database类:

public static class Database
{
  private static IDbConnection Connection { get; set; }
  public static IDbConnection GetConnection()
  {
    if (Connection == null)
    {
      Connection = new SqlConnection("[MyConnectionString]");
      Connection.Open();
    }
    return Connection;
  }
}

public class Order
{
  public void Save()
  {
    var connection = Database.GetConnection();
    connection.Execute("[INSERTION SQL]");
  }

  public List<Order> FindByCustomerEmailAddress(string emailAddress)
  {
    var connection = Database.GetConnection();
    return connection.Query<List<Order>>("SELECT ...");
  }
}

然而,在考虑了这个之后,我不确定这是否是管理数据库连接的好策略。以这种方式使用static似乎很危险。然而,似乎有人必须解决这个问题。但是,我所看到的一切都没有解释,所以我不明白它是否真的有效。有人可以与我分享有效管理数据库连接的推荐方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

打开和关闭与数据库服务器的连接确实很昂贵。但是,.NET出于这个原因实现了连接池,默认情况下它处于打开状态。您可以修改应该保持打开的连接数的设置(我不记得默认设置)。

因此,如果您的连接字符串相同,.NET将重用池中的打开连接并使用它。如果不同,它会创建一个新的。

您的第一个代码在使用&#34;使用&#34;时是正确的所以当你完成后,dispose / close会将连接返回到池中。

在这里查看更多相关信息; https://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx