我最近继承了一个C#Web应用程序,为每个查询创建一个新连接,如下所示:
public class QueryForm
{
public bool getStudents()
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
conn.Open();
//commands
conn.Close();
}
protected void getProfessors()
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
conn.Open();
//Commands
conn.Close();
}
protected void getProfessors()
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
conn.Open();
//Commands
conn.Close();
}
}
我知道这通常是最好的方法,但是让构造函数创建连接对象是可接受的或“最佳实践”,然后打开每个方法/ Query然后关闭该连接:
public class QueryForm
{
SqlConnection conn;
public QueryForm()
{
conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
}
public bool getStudents()
{
conn.Open();
//commands
conn.Close();
}
protected void getProfessors()
{
conn.Open();
//Commands
conn.Close();
}
protected void getCourses()
{
conn.Open();
//Commands
conn.Close();
}
}
我更喜欢第二种方式,因为它不会产生多个连接对象。但是,如果我要使方法和类静态,第一种方式也会更好。
答案 0 :(得分:11)
其中任何一个都是可以接受的。 SqlConnection使用连接池,因此它不应该影响性能。拥有多个SqlConnection对象不会伤害任何东西。这归结为偏好。
如果你在方法中保持连接,我建议将命令封装在using语句中,例如:
using (SqlConnection conn = new SqlConnection(...))
{
conn.Open();
//commands
conn.Close();
}
这可确保正确处理连接。
答案 1 :(得分:2)
在最短时间内保持连接打开非常重要。 SQL连接使用connection pool,因此打开连接实际上会重用幕后连接。 如果您保持连接打开,则可能会遇到错误:如果您使用BeginTransaction方法,则“不支持并行事务”。
这是一个可能有大量连接的网络应用, 将连接对象保持打开状态会使您面临耗尽连接池的风险,并且:“在从池中获取连接之前已经过了超时时间”错误。
此外,即使抛出异常,也必须确保连接已关闭。
这应该使用如下的使用块来完成:
using (SqlConnection conn = new SqlConnection(...))
{
conn.Open();
//commands
}
因为退出'using'块会对使用过的对象调用.Dispose()。
或使用try / catch / finally块,如:
SqlConnection conn = null;
try
{
conn = new SqlConnection(...);
conn.Open();
//commands
}
catch(Exception ex)
{
...
}
finally
{
if(conn != null)
conn.Close();
}