从连接池的角度来看,我做错了吗?

时间:2011-02-02 14:59:39

标签: c# .net linq ado.net connection-pooling

我有一个类,它使用ADO.NET和LINQ来访问一台服务器上的一对数据库。 DB中的表格不广泛,因此实体对象相当轻。我当然使用经验和网络文章编写了最好的代码。例如......

http://dotnetperls.com/sqldataadapter http://www.velocityreviews.com/forums/t71781-set-maximum-pool-size-in-web-config.html http://msdn.microsoft.com/en-us/library/ms971481#adonetbest_topic5

运行我的代码的服务器只运行我的代码,并且与db主机不是同一台服务器。从我的.NET应用服务器(这是一个Windows服务,但我不想详述它,因为它现在看起来无关紧要)查看到数据库服务器的连接,连接数大约是200,但它当然应该少于那个;它应该在10左右,因为我在appSettings.config中将Max Pool Size设置为10。

有人可以查看我的连接代码并告诉我,如果我正在做一些会导致连接出现的事情吗?

这是我的LINQ DB上下文创建:

private const string ConnectionKey = "SQL2";
protected static string ConnectionString
{
    get
    {
        return _connectionString = (_connectionString == null) ? ConfigurationManager.ConnectionStrings[ConnectionKey].ConnectionString : _connectionString;
    }
}
private static string _connectionString = null;

protected static PricingDBDataContext ContextDB
{
    get
    {
        if (_context == null)
        {
            _context = new PricingDBDataContext(ConnectionString);
        }

        return _context;
    }
}
private static PricingDBDataContext _context = null;

这是ADO.NET方面的事情:

protected DataSet GetDataSet(bool isSproc, string cmdStr, params object[] args)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
        {
            cmd.CommandType = isSproc ? CommandType.StoredProcedure : CommandType.Text;
            for (int index = 0; index < args.Length; index += 2)
                cmd.Parameters.AddWithValue(args[index].ToString(), args[index + 1]);
            conn.Open();
            DataSet set = FillSet(cmd);
            conn.Close();
            return set;
        }
    }
}

private DataSet FillSet(SqlCommand cmd)
{
    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    DataSet set = new DataSet();
    adapter.Fill(set);
    return set;
}

谢谢,

1 个答案:

答案 0 :(得分:2)

作为一般规则,如果您正在使用连接池进行任何显式操作,那么您可能做错了。自.Net

早期以来,默认设置对我很有帮助

以下是需要注意的一些事项:

  • ADO将汇集具有完全相同连接字符串的连接
  • 大多数ado.net对象都实现IDisposable,应该明确地或在using块中处理。这包括连接,命令,数据集和数据读取器
  • Linq 2 SQL和EF数据上下文也实现了IDisposable,应该处理