Советы / рекомендации по производительности для веб-службы .NET, предоставляющей информацию с сервера SQL - PullRequest
0 голосов
/ 04 марта 2009

У меня довольно простой веб-сервис, который предоставляет данные с сервера SQL. Он будет использоваться для синхронизации данных между 2 различными базами данных (SQL Server и Lotus Notes). Мы находимся в стадии тестирования веб-сервиса и опрашиваем его с 20 требов. / Мин., Первые 2 минуты все идет нормально, но через секунду мы получаем исключение, очевидно, соединение (с базой данных) ) не может быть открыт (тайм-аут).

Есть ли у вас какие-либо советы / рекомендации о том, что делать или на что посмотреть? Веб-сервис был запрограммирован с использованием C # / .NET, соединение с БД открывается при создании объекта (веб-сервис) и закрывается при удалении объекта.

Я подумал об использовании global.asax, чтобы «поделиться» соединением, но после некоторого поиска в Google я обнаружил, что большинство людей считают эту идею плохой, и я ищу другое решение.

пс. служба объединена в пул синхронно, не существует 2 запросов одновременно

-edit- (после первых 2 ответов о пуле) Это текущий код:

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 ]

4 голосов
/ 04 марта 2009

Звучит так, будто вы исчерпали пул соединений - лучший вариант - обернуть ваши вызовы 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;
    }
}
0 голосов
/ 04 марта 2009

См. По этой ссылке Рекомендации по использованию ADO.NET , в ней вы найдете ссылку на Пул соединений с сервером SQL (ADO.NET) - убедитесь, что вы действительно правильно использовать пул соединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...