我正在学习如何使用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
似乎很危险。然而,似乎有人必须解决这个问题。但是,我所看到的一切都没有解释,所以我不明白它是否真的有效。有人可以与我分享有效管理数据库连接的推荐方法是什么?
谢谢!
答案 0 :(得分:0)
打开和关闭与数据库服务器的连接确实很昂贵。但是,.NET出于这个原因实现了连接池,默认情况下它处于打开状态。您可以修改应该保持打开的连接数的设置(我不记得默认设置)。
因此,如果您的连接字符串相同,.NET将重用池中的打开连接并使用它。如果不同,它会创建一个新的。
您的第一个代码在使用&#34;使用&#34;时是正确的所以当你完成后,dispose / close会将连接返回到池中。
在这里查看更多相关信息; https://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx