Я делаю сайт, используя .net MVC
У меня есть слой доступа к данным, который в основном состоит из объектов статического списка, которые создаются из данных в моей базе данных.
Метод, который перестраивает эти данные, сначала очищает все объекты списка. Как только они опустеют, добавьте данные. Вот пример одного из списков, которые я использую. Это метод, который генерирует все почтовые индексы Великобритании. в моем приложении примерно 50 подобных методов, которые возвращают различную информацию, такую как города, регионы, участники, электронные письма и т. д.
public static List<PostCode> AllPostCodes = new List<PostCode>();
когда вызывается метод перестроения, он сначала очищает список.
ListPostCodes.AllPostCodes.Clear ();
затем он перестраивает данные, вызывая метод GetAllPostCodes ()
/// <summary>
/// static method that returns all the UK postcodes
/// </summary>
public static void GetAllPostCodes()
{
using (fab_dataContextDataContext db = new fab_dataContextDataContext())
{
IQueryable AllPostcodeData = from data in db.PostCodeTables select data;
IDbCommand cmd = db.GetCommand(AllPostcodeData);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = (SqlCommand)cmd;
DataSet dataSet = new DataSet();
cmd.Connection.Open();
adapter.FillSchema(dataSet, SchemaType.Source);
adapter.Fill(dataSet);
cmd.Connection.Close();
// crete the objects
foreach (DataRow row in dataSet.Tables[0].Rows)
{
PostCode postcode = new PostCode();
postcode.ID = Convert.ToInt32(row["PostcodeID"]);
postcode.Outcode = row["OutCode"].ToString();
postcode.Latitude = Convert.ToDouble(row["Latitude"]);
postcode.Longitude = Convert.ToDouble(row["Longitude"]);
postcode.TownID = Convert.ToInt32(row["TownID"]);
AllPostCodes.Add(postcode);
postcode = null;
}
}
}
Перестройка происходит каждые 1 час. это гарантирует, что каждые 1 час на сайте будет свежий набор кэшированных данных.
Проблема, с которой я столкнулся, заключается в том, что иногда, если во время перестроения сервер будет поражен запросом и будет сгенерировано исключение. Исключение составляет «Индекс находился за пределами массива». это связано с тем, что список очищается.
ListPostCodes.AllPostCodes.Clear(); - // throws exception - although its not always in regard to this list.
Как только выбрасывается это исключение, приложение умирает. Я должен перезагрузить сервер, чтобы это исправить.
У меня есть 2 вопроса ...
- Если бы я использовал кэширование вместо статических объектов, это помогло бы?
- Можно ли как-то сказать "пока идет восстановление, дождитесь его завершения до принятия запросов"
любая помощь наиболее ценится;)
truegilly