您应该重用SqlConnection,SqlDataAdapter和SqlCommand对象吗?

我正在使用以类似于以下代码的布局编写的DAL对象。 我简化了很多代码只是为了显示设置。

public class UserDatabase : IDisposable { private SqlDataAdapter UserDbAdapter; private SqlCommand UserSelectCommand; private SqlCommand UserInsertCommand; private SqlCommand UserUpdateCommand; private SqlCommand UserDeleteCommand; private System.Data.SqlClient.SqlConnection SQLConnection; public UserDatabase() { this.SQLConnection = new System.Data.SqlClient.SqlConnection(ConnectionString); this.UserDbAdapter= new SqlDataAdapter(); this.UserDbAdapter.DeleteCommand = this.UserDeleteCommand; this.UserDbAdapter.InsertCommand = this.UserInsertCommand; this.UserDbAdapter.SelectCommand = this.UserSelectCommand; this.UserDbAdapter.UpdateCommand = this.UserUpdateCommand; } private bool FillUsers(DataSet UserDataSet, out int numberOfRecords) { bool success = true; numberOfRecords = 0; string errorMsg = null; this.UserDbAdapter.SelectCommand = this.GetUsersSelectCommand(); numberOfRecords = UserDbAdapter.Fill(UserDataSet, UsersTableName); return success; } private SqlCommand GetUserSelectCommand() { if (this.UserSelectCommand==null) this.UserSelectCommand= new System.Data.SqlClient.SqlCommand(); this.UserSelectCommand.CommandText = "dbo.Users_Select"; this.UserSelectCommand.CommandType = System.Data.CommandType.StoredProcedure; this.UserSelectCommand.Connection = this.SQLConnection; this.UserSelectCommand.Parameters.Clear(); this.UserSelectCommand.Parameters.AddRange(new System.Data.SqlClient.SqlParameter[] { new System.Data.SqlClient.SqlParameter("@RETURN_VALUE", System.Data.SqlDbType.Variant, 0, System.Data.ParameterDirection.ReturnValue, false, ((byte)(0)), ((byte)(0)), "", System.Data.DataRowVersion.Current, null)}); return UserSelectCommand; } 

还有多个其他Fill类型函数的编写方式与重用Connection对象,SqlCommands和SqlDataAdapter的方式相同。 SqlDataAdapter在内部管理SqlConnection的打开和关闭。

所以我的问题是多部分。 这个设计不好吗? 如果是这样,为什么?

如果不好,是否应将其更改为将内容保存在更本地的范围内,如下所示:

  public bool FillUsers(DataSet UserDataSet) { using (SqlConnection conn = new SqlConnection(ConnectionString)) { using (SqlCommand command = GetUsersSelectCommand()) { using (SqlDataAdapter adapter = new SqlDataAdapter(command, conn)) { adapter.Fill(UserDataSet, UsersTableName); } } } } 

这对于所有看起来像创建,处理,然后重建的function都必须要比保留项目更糟糕。 然而,这似乎是我在网上到处看到的设置。

不,这没有任何问题。 完成后,您应该立即处理实现IDisposable的对象。

给定SqlConnection ,当您处置连接时,底层连接将简单地返回到池中。 它可能不像你想象的那样“封闭”。 最好让连接池完成它的工作。 这是MSDN到ADO.NET连接池的链接。 试图让它做的事情不是为了设计(有些人称这种优化,令人惊讶)通常是在兔子洞里旅行。

此外,在尝试优化之前,请确保已实际测量并观察到问题。 (我并不是以严厉的方式表达这一点,只是为了节省你的时间 )。