Совместное использование одного подключения к базе данных между несколькими методами одновременно - PullRequest
0 голосов
/ 08 февраля 2010

У меня есть страница, где пользователь может вставить какой-то заказ о каком-либо продукте. На этой странице также есть живая статистика, которая обновляется каждые 20 секунд, чтобы отразить текущую цену продукта с использованием таймера asp.net. Эта живая панель, извлекающая эти цены из базы данных.

Когда иногда вставляется заказ, я получаю исключение, говорящее о том, что соединение закрыто и команда вставки не может продолжаться. Я подозреваю, что когда дается команда вставки, если в этот момент обновляется текущее обновление, то им обоим необходимо получить доступ к базе данных, и они используют один и тот же объект SqlConnection. Поэтому, когда один завершает работу, объект подключения закрывается, даже если другой использует тот же объект подключения.

Прежде чем закрывать соединение, как я могу быть уверен, что никакие другие методы не используют это соединение?

Код моего класса соединения приведен ниже, для лучшего понимания -

using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Specialized;
using System.IO;
using System.IO.Ports;


public class ConnectionHelper
{

#region Private Variables
static string BOconnectionString = "";
static SqlConnection BOcon = null;
static string STRSconnectionString = "";
static SqlConnection STRScon = null;
static SqlTransaction tSTRSTrans = null;

public static SqlTransaction STRSTrans
{
    get { return ConnectionHelper.tSTRSTrans; }
    set { ConnectionHelper.tSTRSTrans = value; }
}
#endregion


#region Constructor
ConnectionHelper() { }
#endregion



#region Public Functions 

public static SqlConnection getSTRSConnection()
{
    STRSconnectionString = ConfigurationManager.ConnectionStrings["STRS_WEB_DB2ConnectionString"].ConnectionString;
    try
    {
        if ((STRScon == null) || (STRScon.State == ConnectionState.Closed))
        {
            STRScon = new SqlConnection(STRSconnectionString);
            STRScon.Open();
            //tSTRSTrans = STRScon.BeginTransaction(IsolationLevel.RepeatableRead);
        }


    }
    catch (Exception ex)
    {
        throw new Exception("Error occurred when Connection is going to be opened" + ex.Message);
    }
    return STRScon;
}
public static void closeSTRSConnection()
{
    if ((STRScon != null) || (STRScon.State == ConnectionState.Open))
    {
        STRScon.Close();
    }        
}

#endregion

}

Если метод хочет получить доступ к базе данных, он получает и закрывает соединение следующим образом -

con = ConnectionHelper.getSTRSConnection();
........
........
ConnectionHelper.closeSTRSConnection();

Ответы [ 4 ]

3 голосов
/ 08 февраля 2010

Создавайте новые объекты, не делитесь объектами. ADO.net управляет пулами соединений, вам не нужно пытаться делать это самостоятельно.

2 голосов
/ 08 февраля 2010

Я не думаю, что вы должны использовать этот подход для веб-приложения, я вижу, что вы намереваетесь использовать обычное соединение, но подумайте над рефакторингом вашего кода, чтобы вместо попытки использовать существующее соединение, то есть "getSTRSConnection", просто открыть соединение | делай свою работу | и закрой его. Как правило, хорошая идея - открывать соединения как можно позже, а затем закрывать соединение, как только работа завершена, - еще одна хорошая идея. Помните, что эти соединения являются дорогостоящим ресурсом и должны действовать только в течение времени, необходимого для сохранения информации в вашей базе данных.

1 голос
/ 08 февраля 2010

Это плохая идея иметь одно соединение для многопользовательской среды. Когда вы используете одно соединение для всех ваших пользователей, если кто-то выполняет действие, которое требует, скажем, 15 секунд, только для доступа к базе данных, всем остальным пользователям придется ждать, чтобы подключиться к базе данных.

1 голос
/ 08 февраля 2010

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

Общие сведения о пуле соединений в .NET
Настройка пула соединений ADO.NET в приложениях ASP.NET

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