Как Subsonic обрабатывает соединения? - PullRequest
3 голосов
/ 11 августа 2009

В Nhibernate вы начинаете сеанс, создавая его во время запроса BeginRequest и закрывая в EndRequest

public class Global: System.Web.HttpApplication
{
    public static ISessionFactory SessionFactory = CreateSessionFactory();

    protected static ISessionFactory CreateSessionFactory()
    {
        return new Configuration()
            .Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "hibernate.cfg.xml"))
            .BuildSessionFactory();
    }

    public static ISession CurrentSession
    {
        get{ return (ISession)HttpContext.Current.Items["current.session"]; }
        set { HttpContext.Current.Items["current.session"] = value; }
    }

    protected void Global()
    {
        BeginRequest += delegate
        {
            CurrentSession = SessionFactory.OpenSession();
        };
        EndRequest += delegate
        {
            if(CurrentSession != null)
                CurrentSession.Dispose();
        };
    }
}

Что эквивалентно в Subsonic?

Насколько я понимаю, Nhibernate закроет все соединения в конце запроса.

Причина: Во время проблем со стрельбой из устаревшего кода в проекте Subsonic я получаю много тайм-аутов MySQL, предполагая, что код не закрывает соединения

MySql.Data.MySqlClient.MySqlException: ошибка подключения: истекло время ожидания. тайм-аут истек до получение соединения из пула. Это могло произойти, потому что все пулы соединений использовались и макс Размер бассейна был достигнут. Сгенерировано: вт, 11 августа 2009 05:26:05 GMT System.Web.HttpUnhandledException: Исключение типа 'System.Web.HttpUnhandledException' был брошен. ---> MySql.Data.MySqlClient.MySqlException: ошибка подключения: истекло время ожидания. Время ожидания истекло до получение соединения из пула. Это могло произойти, потому что все пулы соединений использовались и макс Размер бассейна был достигнут. в MySql.Data.MySqlClient.MySqlPool.GetConnection () в MySql.Data.MySqlClient.MySqlConnection.Open () в SubSonic.MySqlDataProvider.CreateConnection (String newConnectionString) в SubSonic.MySqlDataProvider.CreateConnection () в SubSonic.AutomaticConnectionScope..ctor (DataProvider поставщик) в SubSonic.MySqlDataProvider.GetReader (QueryCommand кри) в SubSonic.DataService.GetReader (QueryCommand cmd) в SubSonic.ReadOnlyRecord`1.LoadByParam (String columnName, Object paramValue)

Моя строка подключения выглядит следующим образом

<connectionStrings>
    <add name="xx" connectionString="Data Source=xx.net; Port=3306; Database=db; UID=dbuid; PWD=xx;Pooling=true;Max Pool Size=12;Min Pool Size=2;Connection Lifetime=60" />
  </connectionStrings>

Ответы [ 2 ]

5 голосов
/ 11 августа 2009

Это всегда одноразовый снимок, если вы специально не обернули свои вещи с помощью "SharedDbConnectionScope". Я видел это раньше - особенно при тестировании MySQL на Windows - и проблема в том, что драйвер MySQL глючит и не отключает соединения.

Мне удалось воспроизвести это, создав консольное приложение и базовый ридер, затем циклически повторяя его - bam. Ошибки ConnectionPool.

Не очень много ответа, я знаю, но что вы можете сделать.

4 голосов
/ 12 августа 2009

Я сталкивался с той же ошибкой, что и раньше, при неправильном использовании SubSonic. У нас был фрагмент Javascript, который пинговал сервер каждые 2 или около того минут, чтобы поддержать наш сеанс, и когда он пинговал сервер, был сделан вызов нашему членству, который использовал DataReader. В любом случае, если коротко, мы не закрывали читателя, и маленький скрипт поддержки активности постепенно поглотил все наши 160 разрешенных соединений даже с небольшим количеством пользователей. Возможно, вы захотите проверить, используете ли вы SubSonic таким образом (возвращая IDataReader из запросов, а затем не удаляя их)

...