.NET Web服务的性能提示/提示,提供来自sql server的信息

时间:2009-03-04 12:30:40

标签: .net sql-server performance web-services debugging

我有一个相当简单的Web服务,它从sql server公开数据。它将用于在两个不同的数据库(SQL Server和Lotus Notes)之间同步数据。我们正处于测试Web服务的阶段,并以20 req./min进行轮询,前2分钟就可以了,但是在第二个之后,我们得到一个异常,显然是连接(到数据库) )无法打开(超时)。

您有关于做什么或在哪里看的提示/建议吗? Web服务已使用C#/ .NET编程,在构建(Web服务)对象期间打开与db的连接,在处理对象时关闭。

我考虑过使用global.asax来“分享”这种联系,但经过一些谷歌搜索后,我发现大多数人发现这是一个坏主意,我正在寻找不同的解决方案。

PS。服务以同步方式汇集,同时不存在2个请求

CNC中 (在前2个关于汇集的anwsers之后) 这是当前代码:

public class DataService : System.Web.Services.WebService
{
    private SqlConnection conn = new SqlConnection("Data Source=ip;database=database;uid=user;pwd=secret;");
    public DataService () 
    {
            try
            {
                conn.Open();

            }
            catch (Exception dbconn)
            {
                throw new SoapException("Couldn't open connection to database:" + dbconn.Message + " More info at: " + dbconn.HelpLink, errorCode);
            }
            //Uncomment the following line if using designed components 
            //InitializeComponent(); 
    }
    ~DataService()
    {
         conn.Close();
    }
    [WebMethod(Description="Gets all Person changes(from last week)")]
    public Person[] GetPerson()
    { 
            Person[] Personen = null;
            SqlCommand sqlcmd = conn.CreateCommand();

            sqlcmd.CommandText = "SELECT * FROM Person";
            SqlDataReader Rows = sqlcmd.ExecuteReader();
            while (Rows.Read())
            {
                    //doSomething
            }

            Rows.Close();
            return Personen;
    }

}

2 个答案:

答案 0 :(得分:4)

听起来你已经筋疲力尽了连接池 - 最好的选择是使用块来包装SQL调用,因此松散:

using( SqlConnection con = new SqlConnection( "MyConnectionString" ) )
{
    con.Open();

    using( SqlCommand cmd = new SqlCommand( "MyStoredProcedure", con ) )
    {
        // Do stuff with the Command
    }
}

这将允许您同时提供与连接池大小相同数量的请求。

因此,编辑后的代码变为:

public class DataService : System.Web.Services.WebService
{
    [WebMethod(Description="Gets all Person changes(from last week)")]
    public Person[] GetPerson()
    { 
        Person[] Personen = null;

        using( SqlConnection conn = new SqlConnection("Data Source=ip;database=database;uid=user;pwd=secret;") )
        {
            using( SqlCommand sqlcmd = conn.CreateCommand() )
            {
                sqlcmd.CommandText = "SELECT * FROM Person";
                SqlDataReader Rows = sqlcmd.ExecuteReader( CommandBehavior.CloseConnection ); // This will close the DB connection ASAP
                while (Rows.Read())
                {
                    //doSomething
                }

                Rows.Close();
            }
        }

        return Personen;
    }
}

答案 1 :(得分:0)

请参阅此链接Best Practices for Using ADO.NET,其中包含指向SQL Server Connection Pooling (ADO.NET)的链接 - 确保您确实正确使用了连接池。