Data Access Layer - static list objects and caching

Posted by Truegilly on Stack Overflow See other posts from Stack Overflow or by Truegilly
Published on 2010-04-21T09:03:45Z Indexed on 2010/04/21 9:53 UTC
Read the original article Hit count: 310

Hello,

i am devloping a site using .net MVC

i have a data access layer which basically consists of static list objects that are created from data within my database.

The method that rebuilds this data first clears all the list objects. Once they are empty it then add the data. Here is an example of one of the lists im using. its a method which generates all the UK postcodes. there are about 50 methods similar to this in my application that return all sorts of information, such as towns, regions, members, emails etc.

public static List<PostCode> AllPostCodes = new List<PostCode>();
  1. when the rebuild method is called it first clears the list.

    ListPostCodes.AllPostCodes.Clear();

  2. next it re-bulilds the data, by calling the GetAllPostCodes() method

    /// <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;
        }
    }
    
    }

The rebuild occurs every 1 hour. this ensures that every 1 hour the site will have fresh set of cached data.

the issue ive got is that occasionally if during a rebuild, the server will be hit by a request and an exception is thrown. The exception is "Index was outside the bounds of the array." it is due to when a list is being cleared.

ListPostCodes.AllPostCodes.Clear(); - // throws exception - although its not always in regard to this list.

Once this exception is thrown application dies, All users are affected. I have to restart the server to fix it.

i have 2 questions...

  1. If i utilise caching instead of static objects would this help ?
  2. Is there any way i can say "while the rebuild is taking place, wait for it to complete until accepting requests"

any help is most appricaiated ;)

truegilly

© Stack Overflow or respective owner

Related posts about caching

Related posts about data-access-layer