использование статического DataContext в службе WCF вызывает ошибки? - PullRequest
0 голосов
/ 11 августа 2010

У меня есть служба WCF, которая поддерживает несколько соединений с различными базами данных.Я использую Linq для Sql объектов.

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

private static Dictionary<String, GenericDataClassesDataContext> _db = new Dictionary<string,GenericDataClassesDataContext>(); 

private bool AddConnection(string applicationName, string connectionString)
{
    try
    {
        //Test Connection
        SqlConnection testConn = new SqlConnection(connectionString);
        testConn.Open();
        string commandString = "Select * from ModelEntity";
        SqlCommand sqlCmd = new SqlCommand(commandString, testConn);
        SqlDataReader dataReader = sqlCmd.ExecuteReader();

        //if exists remove
        if (_db.ContainsKey(applicationName))
            _db.Remove(applicationName);

        //add connection
        _db.Add(applicationName, new GenericDataClassesDataContext(connectionString));
        _db[applicationName].ObjectTrackingEnabled = false;

        return true;
    }
    catch
    {
        return false;
    }
}

private bool CheckConnection(string applicationName)
{          
    try
    {
        if (!_db.ContainsKey(applicationName))
        {
            _genericConnection.Open();
            SqlCommand thisCommand = new SqlCommand("GetConnection", _genericConnection);
            thisCommand.CommandType = CommandType.StoredProcedure;
            thisCommand.Parameters.Add(
                new SqlParameter("@Name", applicationName));

            SqlDataReader thisReader = thisCommand.ExecuteReader();
            while (thisReader.Read())
            {
                string conString = thisReader[1].ToString();
                if (AddConnection(applicationName, conString) == false)
                    return false;
            }

            thisReader.Close();
        }                

        return true;
    }
    finally
    {
        if (_genericConnection != null)
        {
            _genericConnection.Close();
        }                   
    }
}

Пример вызова

public ReferenceValue[] GetReferenceValues(string applicationName)
{
    if (CheckConnection(applicationName))
        return _db[applicationName].ReferenceValues.ToArray();

    return null;
}

(В большинстве примеров я вижу, что новый DataContext создается для каждого вызова службы, поэтому я теперь думаю, что у меня может быть серьезный недостаток дизайна)

Проблема, с которой я сталкиваюсь, заключается в том, что

A \ При возникновении ошибки в приложении WCF мое соединение прерывается для последующих вызовов (как минимум, на некоторое время)

B \ Иногда я получаю сообщение об ошибке: «Ссылка на объект не установлена ​​для экземпляра объекта».

Это неправильный подход, нужно ли открывать соединение каждый раз, когда естьзвонок в мою службу?

Ответы [ 2 ]

1 голос
/ 11 августа 2010

Не используйте статический экземпляр DataContext. Он (и имеющееся у него SQLConnection) не является потокобезопасным.

0 голосов
/ 11 августа 2010

Я обновил свою службу wcf, поэтому она устанавливает текст данных при каждом вызове метода, и похоже, что это решило мои проблемы.

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