在调用SQL CLR过程时,应用程序池大小达到Max获取错误

时间:2017-04-18 10:15:27

标签: c# sql asp.net sql-server sqlclr

运行asp.net应用程序时调用sql server中托管的存储过程,并返回以下错误: -

An error occurred: A .NET Framework error occurred during execution of user-defined routine or aggregate "Procedure Name": 
 System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
System.InvalidOperationException: 
 at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at StoredProcedures.ProcedureName(String sourceConnectionString, String destinationConnectionString, String sql, String destinationTable, String columns)”

我们正在使用asp.net锅炉板和实体框架。 在SQL CLR中,我们使用了“使用”关键字来使用ado.net并关闭连接。 所以我认为连接问题不应该存在。

请在存储过程中建议我们通过传递连接字符串从一个源获取数据到另一个源。

2 个答案:

答案 0 :(得分:1)

您遇到的问题通常发生在与数据库建立多个连接但未在使用后正确关闭/处置连接时。

•确保在使用后关闭所有连接。 •您还可以在连接/过程类上继承IDisposable。实现dispose方法以在使用后清除实例化的连接。

见下面的例子:

public partial class Connection : IDisposable
{

    /// <summary>
    /// Gets or sets the connection string.
    /// </summary>
    protected static string ConnectionString
    {
        get
        {
            return ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
        }
    }

    /// <summary>
    /// Default Constructor for the Database Connection Class.
    /// </summary>
    public Connection()
    {
        this.sqlConnection = new SqlConnection(Connection.ConnectionString);
        this.sqlConnection.Open();
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    public void Dispose()
    {
        if (sqlConnection != null)
        {
            if (sqlConnection.State != System.Data.ConnectionState.Closed)
                sqlConnection.Close();

            sqlConnection.Dispose();
            sqlConnection = null;
        }
    }
}

答案 1 :(得分:1)

通常,每次调用远程实例(在SQLCLR存储过程中完成)需要多长时间?并且,通常调用此存储过程的频率是多少?如果您确实在SqlConnection构造中正确地实例化了using(例如using (SqlConnection _Connection = new SqlConnection(UserConnectionString)) { ... }),那么有没有理由假设“这可能是因为所有池化连接都在使用中,并且达到了最大池大小。“是误导性的,或者由于某些网络问题而导致实际超时?

请记住,默认的连接池大小为100个连接。如果此代码需要一秒钟(或几个)来完成,并且如果频繁调用此代码,那么很可能你真的用完了池中的连接。您至少可以通过在连接字符串中添加以下内容来增加池大小来测试此理论:

Max Pool Size = 200;

它不需要是200,但是如果你尝试并且再也不会得到错误,那么你确实用完了默认的100个连接。如果您仍然收到错误,那么可能还有其他事情发生,例如网络延迟或SQL Server耗尽可用连接,而且首先不再允许。