У меня есть служба 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 \ Иногда я получаю сообщение об ошибке: «Ссылка на объект не установлена для экземпляра объекта».
Это неправильный подход, нужно ли открывать соединение каждый раз, когда естьзвонок в мою службу?