C# 调用SQL CLR过程时,获取应用程序池大小达到最大获取错误

C# 调用SQL CLR过程时,获取应用程序池大小达到最大获取错误,c#,sql,asp.net,sql-server,sqlclr,C#,Sql,Asp.net,Sql Server,Sqlclr,运行asp.net应用程序时,该应用程序正在调用sql server中托管的存储过程,sql clr返回以下错误:- An error occurred: A .NET Framework error occurred during execution of user-defined routine or aggregate "Procedure Name": System.InvalidOperationException: Timeout expired. The timeout per

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

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并通过使用“using”关键字关闭连接。 所以我认为不应该有关系密切的问题


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

您遇到的问题通常发生在与数据库建立了多个连接,但使用后从未正确关闭/处理连接的情况下

•使用后,确保关闭所有连接。 •您还可以在连接/过程类上继承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;
        }
    }
}
公共部分类连接:IDisposable
{
/// 
///获取或设置连接字符串。
/// 
受保护的静态字符串连接字符串
{
得到
{
返回ConfigurationManager.ConnectionString[“conString”].ConnectionString;
}
}
/// 
///数据库连接类的默认构造函数。
/// 
公共连接()
{
this.sqlConnection=newsqlconnection(Connection.ConnectionString);
this.sqlConnection.Open();
}
/// 
///清理所有正在使用的资源。
/// 
公共空间处置()
{
if(sqlConnection!=null)
{
if(sqlConnection.State!=System.Data.ConnectionState.Closed)
sqlConnection.Close();
sqlConnection.Dispose();
sqlConnection=null;
}
}
}

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

请记住,默认连接池大小为100个连接。如果此代码需要一秒钟(或几秒钟)若要完成此操作,并且经常调用此代码,则很可能池中的连接确实已用完。您至少可以通过在连接字符串中添加以下内容来增加池大小来测试此理论:

Max Pool Size = 200;

它不需要是200,但是如果您尝试了,并且再也没有出现错误,那么您的默认100个连接已经用完了。如果您仍然出现错误,那么可能还有其他原因,例如网络延迟或SQL Server没有可用的连接,并且一开始就不允许更多连接。

在任何地方关闭你的连接?运行代码分析以确保你没有留下任何未被发现的东西。哦,请在你打开连接(并关闭)的地方发布一些代码片段,并调用sql。是的,我已经关闭了连接。将存储过程从一个不同的服务器复制数据到sqlclr正在使用存储过程的当前服务器将需要一些时间。sql CLR存储过程调用非常频繁。@MayankJain好的,很高兴知道。因此,我走对了方向,您需要设置
Max Pool Size=200;
连接字符串中。您是否使用
SqlBulkCopy
移动数据?