SqlConnection对象使用哪种模式更好?

3

SqlConnection对象应该使用哪种模式更好?哪种模式在性能上更好?您还提供其他模式吗?

class DataAccess1 : IDisposable
{
    private SqlConnection connection;

    public DataAccess1(string connectionString)
    {
        connection = new SqlConnection(connectionString);
    }

    public void Execute(string query)
    {
        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandText = query;
            command.CommandType = CommandType.Text;
            // ...

            command.Connection.Open();
            command.ExecuteNonQuery();
            command.Connection.Close();
        }
    }

    public void Dispose()
    {
        connection.Dispose();
    }
}

VS

class DataAccess2 : IDisposable
{
    private string connectionString;

    public DataAccess2(string connectionString)
    {
        this.connectionString = connectionString;
    }

    public void Execute(string query)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = connection.CreateCommand();
            command.CommandText = query;
            command.CommandType = CommandType.Text;
            // ...

            command.Connection.Open();
            command.ExecuteNonQuery();
            command.Connection.Close();
        }
    }

    public void Dispose()
    {            
    }
}
4个回答

3
这个问题没有一个确切的答案。简短、规范的答案是:连接应该在你的工作单元的生命周期内保持活动状态。因为我们不知道 DataAccess 如何被使用(它是否存在于应用程序的整个生命周期,还是每次执行操作时都实例化和释放它?),所以无法给出具体的答案。
尽管如此,我建议采用第一种模式,但根据需要实例化和释放你的 DataAccess 对象;不要将其保留时间过长。

1
建议使用。虽然这是个人喜好。有些人甚至会建议你的类是的。很难说哪一个更高效。你正在走的道路,这是很好的。
我很乐意阅读并维护你在问题中展示的两种样式。
考虑让你的数据访问层也能从.config文件中读取连接字符串,而不是仅允许通过构造函数传递值。
public DataAccess2(string connStr)
{
    this.connectionString = connStr;
}
public DataAccess2()
{
    this.connectionString = 
            ConfigurationManager.ConnectionStrings["foo"].ConnectionString;
}

考虑在你的 SqlCommand 中也套用一个 using

using (var conn = new SqlConnection(connectionString))
{
    using(var cmd = conn.CreateCommand())
    {

    }
}

2
我建议不要让类读取连接字符串。让应用程序读取配置信息并将其传递给使用者;没有理由限制类的可移植性。 - Adam Robinson
@Adam:我同意你关于限制可移植性的观点。我会修改代码,加入一个构造函数,允许调用者提供值。 - p.campbell

1

如果您进行并发调用,第一个将导致错误。

第二个将确保您为每个命令使用干净的连接,从而产生更多的连接。

我同意以上观点,它取决于使用场景。为了解决与第一个相关的问题,我编写了一个包装器需要使用这样的模式,因此我设置一个字段值布尔值来显示已经在连接上执行了一个命令,然后“排队”下一个要执行的命令。

当然会有一些情况您可能更喜欢使用多个连接......


0

我认为这取决于你的DataAccess对象的使用方式,如果它在'using'子句中使用,则连接在完成后保证被处理。

但总的来说,我更喜欢第二种模式,因为sql连接是在Execute方法中创建和处理的,所以当你忘记处理DataAccess对象时,它不太可能被保持打开状态。

考虑到sql连接可能是一种稀缺资源,我认为应该尽一切努力确保它们不被浪费。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接