Время ожидания подключения к SQL - PullRequest
0 голосов
/ 02 мая 2018

У меня есть веб-приложение, которое содержит класс для подключения к серверу sql. Я написал класс соединения, как показано ниже

public SqlConnection DbConnectSql()
{
    string str = System.Configuration.ConfigurationManager.ConnectionStrings["conStr"].ToString();
    _con = new SqlConnection(str);
    if (_con.State == ConnectionState.Open)
        _con.Close();
    _con.Open();
   return _con;
}

Когда я использую приведенный выше код на производственном сервере, иногда соединение не открывается. Соединение работает нормально после перезапуска IIS. Я должен делать перезапуск IIS каждые два дня. работать sql соединение. Мы не получили точного исключения из этого вопроса.

Чтобы решить эту проблему, нужно ли закрыть соединение для всех остальных случаев, кроме «_con.State == ConnectionState.Closed»? Если мы сделаем это, есть ли последствия для этого кода?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

нам нужно закрыть соединение для всех остальных случаев

Конечно, просто потому, что все соединения созданы в одном пуле. Смотри https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling

  • Старайтесь свести к минимуму создание соединений (или повторное использование существующих)
  • После завершения использования позвоните con.Close(), а затем con.Dispose(), чтобы застраховать свои свободные ресурсы
0 голосов
/ 02 мая 2018

Изменить

 if (_con.State == ConnectionState.Open)
            _con.Close();
        _con.Open();

в

 if (_con.State == ConnectionState.Closed)
                _con.Open();

и попробуй.

Обычно не рекомендуется проверять, открыто ли соединение при запуске, а затем сразу же закрывать и снова открывать, так как могут возникнуть проблемы с задержкой.

Имеет гораздо больше смысла проверить, есть ли какое-либо соединение, открытое с этим сеансом (connection == Connection.Closed), а затем, если оно закрыто, открыть его, иначе ничего не делать, потому что я уже подключен.

Таким образом, помимо того, чтобы быть более логически значимым, он также более лаконичен.

Кроме того, в вашем коде, когда вы используете SqlConnection, оберните их в

using(_con)
{
    //code here, sql stuff
};

, поскольку он будет управлять всеми средствами закрытия и удаления соединения, поэтому вы уверены, что после выполнения вашей логики sql все будет правильно расположено без необходимости вызова методов Close и Dispose вручную.

Дайте мне знать, если это сработало.

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