为什么我有.NET池问题?

时间:2013-12-06 17:57:47

标签: c# sql .net sql-server connection-pooling

我们的.NET应用程序池与SQL数据库的连接存在一些问题,似乎我们遇到连接泄漏但不知道在哪里。

我们使用具有私有IDbCommand变量和私有数据读取器变量的数据类从SQL Server DB加载POCO。在调用DB时,我们首先将两者都传递给创建连接的SQLAccess类,打开它,将连接分配给IDbCommand的连接属性并返回。

回到数据类后,我们使用连接来水合POCO,然后调用Reader.close和IDbCommand.Connection.Dispose。但是,当查看SQL所具有的连接数时,它会持续上升,直到达到100,然后它就会爆炸。连接字符串是硬编码的,因此每次都是相同的。我无法理解为什么.NET没有以更好的方式关闭/处理连接。很抱歉,如果我遗漏了一些关键细节,因为我不知道问题,我不确定什么是有用的信息,什么不是。

举个例子:

这是我们的ImageData类

中的方法之一
public bool PdLoad(UserToken token, string keyCode, ref Image img, int size, bool fixWidth, bool fixHeight)
    {
        bool result;

        SqlText1 = "Exec PDPr_AUX_Image " + keyCode;

        result = ErrRepLd(token, Cmd1, out _rdr1);

        if (!result)
        {
            ItemErrorMessage(img);
            return result;
        }

        Hydrate_Thumbnail(_rdr1, img, size, fixWidth, fixHeight);
        _rdr1.Close();
        Cmd1.Connection.Close();

        return result;
    }

这是我们的SQLAccess类中的一个方法(它是初始化连接的SetProvider方法):

public bool ErrRepLd(UserToken token, IDbCommand cmd, out IDataReader dr)
    {
        bool result = false;

        if (!SetProviderCommand(token, cmd))
        {
            dr = default(SqlDataReader);
            return result;
        }

        try
        {
            cmd.Connection.Open();
            dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            dr.Read();
            Result1 = Convert.ToInt32(dr["Result"]);
            Result2 = Convert.ToInt32(dr["Result2"]);
            if (Result1 ==0)
                result = true;
            if (!result)
                dr.Close();
        }
        catch
        {
            // log the error
            if ((dr != null) && (!dr.IsClosed))
                dr.Close();
        }

        return result;
    }

我所知道的一件事是在SQL Access类中没有带有close的finally语句,但是当该调用成功时问题就发生了,所以这不是完整的故事。

所以我总结一下;为什么我的连接没有被.NET关闭/重用?

0 个答案:

没有答案