Lazy Loading - Eager Loading

In this article I want to discuss the lazy loading mechanism provided by NHibernate. It is recommended for maximum flexibility to define all relations in your domain as lazy loadable. This is the default behavior of NHibernate since version 1.2. But this can lead to some undesired effects if querying your data. Let's discuss these effects and how to avoid them.

In my previous posts I showed how to prepare your system for NHibernate and how to implement a first NHibernate base application. This post is based on those two articles.

The Domain

Let's first define a simple domain. It shows part of an order entry system. I keep this model as simple as possible (a real domain model would be more complex) but it contains all aspects we want to discuss in this post. Below is the class diagram of our model

image

We have an order entity which can be placed by a customer entity. Each order can have many order line entities. Each of the three entity types is uniquely identified by a property Id (surrogate key).

The Mapping Files

We have to write one mapping file per entity. It is recommended that you always have one mapping per file. Don't forget to set the Build Action of each mapping file to Embedded Resource. People often tend to forget it and the subsequent errors raised by NHibernate are not always obvious. Also do not forget to give the mapping files the correct name, that is *.hbm.xml where * denotes the placeholder for the entity name.

The mapping for the Order entity might be implemented as follows

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="LazyLoadEagerLoad"
                   namespace="LazyLoadEagerLoad.Domain">
  
  <class name="Order" table="Orders">
    <id name="Id">
      <generator class="guid"/>
    </id>
    <property name="OrderNumber"/>
    <property name="OrderDate"/>
    
    <many-to-one name="Customer" />
 
    <set name="OrderLines" cascade="all-delete-orphan" >
      <key column="OrderId"/>
      <one-to-many class="OrderLine"/>
    </set>
    
  </class>
  
</hibernate-mapping>

Analogous you can implement the mappings for the Customer entity

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="LazyLoadEagerLoad"
                   namespace="LazyLoadEagerLoad.Domain">
  
  <class name="Customer">
    <id name="Id">
      <generator class="guid"/>
    </id>
    <property name="CompanyName"/>
  </class>
 
</hibernate-mapping>

and finally the mapping for the OrderLine entity.

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="LazyLoadEagerLoad"
                   namespace="LazyLoadEagerLoad.Domain">
 
  <class name="OrderLine">
    <id name="Id">
      <generator class="guid"/>
    </id>
    <property name="Amount"/>
    <property name="ProductName"/>
  </class>
  
</hibernate-mapping>

 

Testing the Mapping

To test the mapping we use the following test method

using LazyLoadEagerLoad.Domain;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using NUnit.Framework;
 
namespace LazyLoadEagerLoad.Tests
{
    [TestFixture]
    public class GenerateSchema_Fixture
    {
        [Test]
        public void Can_generate_schema()
        {
            var cfg = new Configuration();
            cfg.Configure();
            cfg.AddAssembly(typeof(Order).Assembly);
 
            new SchemaExport(cfg).Execute(false, true, false, false);
        }
    }
}
First we create a new instance of the NHibernate Configuration class and tell it to configure itself. Since we don't provide any explicit configuration here in the code NHibernate looks out for an adequate configuration file. I have included such a file (called hibernate.cfg.xml) in my project. Please consult this previous post for further details about the configuration file.

Testing the Loading Behavior of NHibernate

Defining a base class for our tests

To avoid repetitive task (DRY principle) we implement the following base class.

using LazyLoadEagerLoad.Domain;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using NUnit.Framework;
 
namespace LazyLoadEagerLoad.Tests
{
    public class TestFixtureBase
    {
        private Configuration _configuration;
        private ISessionFactory _sessionFactory;
 
        protected ISessionFactory SessionFactory
        {
            get { return _sessionFactory; }
        }
 
        [TestFixtureSetUp]
        public void TestFixtureSetUp()
        {
            _configuration = new Configuration();
            _configuration.Configure();
            _configuration.AddAssembly(typeof(Customer).Assembly);
            _sessionFactory = _configuration.BuildSessionFactory();
        }
 
        [TestFixtureTearDown]
        public void TestFixtureTearDown()
        {
            _sessionFactory.Close();
        }
 
        [SetUp]
        public void SetupContext()
        {
            new SchemaExport(_configuration).Execute(false, true, false, false);
            Before_each_test();
        }
 
        [TearDown]
        public void TearDownContext()
        {
            After_each_test();
        }
 
        protected virtual void Before_each_test()
        { }
 
        protected virtual void After_each_test()
        { }
    }
}

When the test fixture is started, the base class configures NHibernate and creates a session factory (TestFixtureSetUp). When the whole test fixture is ended the session factory is closed (TestFixtureTearDown).

Before each test in the fixture is run the database schema is (re-) created and the virtual Before_each_test method is called. After each test in the fixture is finished the virtual After_each_test method is called. The two virtual methods can (but must not necessarily) be overridden in a child class.

All our test fixtures we implement will derive from this base class.

Filling the database with test data

To be able to test the loading behavior of NHibernate we need some test data in our database. We create this test data every time a test is run (just after the database schema is re-created). We add a new class Order_Fixture to our test project and inherit from the TestFixtureBase base class. Then we override the Before_each_test method and call a helper method which creates our initial data. We create just the absolute minimum of data we need (again -->DRY). That is: one customer placing one order with two order lines.

using System;
using LazyLoadEagerLoad.Domain;
using NHibernate;
using NHibernate.Criterion;
using NHibernate.SqlCommand;
using NUnit.Framework;
using Order=LazyLoadEagerLoad.Domain.Order;
 
namespace LazyLoadEagerLoad.Tests
{
    [TestFixture]
    public class Order_Fixture : TestFixtureBase
    {
        private Order _order;
 
        protected override void Before_each_test()
        {
            base.Before_each_test();
            CreateInitialData();
        }
 
        private void CreateInitialData()
        {
            // create a single customer and an order with two order lines for this customer
            var customer = new Customer {CompanyName = "IBM"};
            var line1 = new OrderLine {Amount = 5, ProductName = "Laptop XYZ"};
            var line2 = new OrderLine {Amount = 2, ProductName = "Desktop PC A100"};
            _order = new Order
                        {
                            OrderNumber = "o-100-001",
                            OrderDate = DateTime.Today,
                            Customer = customer
                        };
            _order.OrderLines.Add(line1);
            _order.OrderLines.Add(line2);
 
            using (ISession session = SessionFactory.OpenSession())
                using (ITransaction transaction = session.BeginTransaction())
                {
                    session.Save(customer);
                    session.Save(_order);
                    transaction.Commit();
                }
        }
    }
}

The CreateInitialData method is run before each test. With this we guarantee that each test is side effects free.

Verifying the default behavior - Lazy Loading

When loading an order entity from database the default behavior of NHibernate is to lazy load all associated objects of the order entity. Let's write a test to verify this. For the verification we use a utility class provided by NHibernate (NHibernateUtil) which can test whether an associated object or object collection is initialized (i.e. loaded) or not. The class can also force the initialization of an un-initialized relation.

[Test]
public void Customer_and_OrderLines_are_not_loaded_when_loading_Order()
{
    Order fromDb;
    using (ISession session = SessionFactory.OpenSession())
        fromDb = session.Get<Order>(_order.Id);
 
    Assert.IsFalse(NHibernateUtil.IsInitialized(fromDb.Customer));
    Assert.IsFalse(NHibernateUtil.IsInitialized(fromDb.OrderLines));
}

The test succeeds and NHibernate generates SQL similar to this one

SELECT    order0_.Id as Id0_0_, 
    order0_.OrderNumber as OrderNum2_0_0_, 
    order0_.OrderDate as OrderDate0_0_, 
    order0_.CustomerId as CustomerId0_0_ 
FROM    Orders order0_ 
WHERE    order0_.Id='15bca5b3-2771-4bee-9923-85bda66318d8'

Now we have a problem: If we want to access the order line items (after the session has been closed) we get an exception. Since the session is closed NHibernate cannot lazily load the order line items for us. We can show this behavior with the following test method

[Test]
[ExpectedException(typeof(LazyInitializationException))]
public void Accessing_customer_of_order_after_session_is_closed_throws()
{
    Order fromDb;
    using (ISession session = SessionFactory.OpenSession())
        fromDb = session.Get<Order>(_order.Id);
    
    // trying to access the Customer of the order, will throw exception
    // Note: at this point the session is already closed
    string name = fromDb.Customer.CompanyName;
}

Note: the above test only succeeds if the method throws the expected exception of type LazyInitializationException. And this is just what we want to show!

Another problem is the n+1 select statements problem. If we access the order line items after loading the order we generate a select statement for each line item we access. Thus if we have n line items and want to access them all we generate one select statement for the order itself and n select statements for all line items (result: n+1 select statements). This can make our data fetching rather slow and put a (unnecessary) burden onto our database.

We can simulate this behavior with this test method

[Test]
public void Show_n_plus_1_select_behavior()
{
    using (ISession session = SessionFactory.OpenSession())
    {
        var fromDb = session.Get<Order>(_order.Id);
        int sum = 0;
        foreach (var line in fromDb.OrderLines)
        {
            // just some dummy code to force loading of order line
            sum += line.Amount;
        } 
    }
}

NHibernate will generate SQL similar to the following

SELECT order0_.Id as Id3_0_, 
       order0_.OrderNumber as OrderNum2_3_0_, 
       order0_.OrderDate as OrderDate3_0_, 
       order0_.Customer as Customer3_0_ 
FROM   Orders order0_ 
WHERE  order0_.Id='5b2dbcb7-d0bf-4c53-86aa-8cd40cb5061a'
 
SELECT orderlines0_.OrderId as OrderId1_, 
       orderlines0_.Id as Id1_, 
       orderlines0_.Id as Id4_0_, 
       orderlines0_.Amount as Amount4_0_, 
       orderlines0_.ProductName as ProductN3_4_0_ 
FROM   OrderLine orderlines0_ 
WHERE  orderlines0_.OrderId='5b2dbcb7-d0bf-4c53-86aa-8cd40cb5061a'

This time we have been lucky! NHibernate has automatically generated an optimized query for us and has loaded the 2 order line items in one go. But this is not always the case! Imagine having a collection with several 100 items and you only need to access one or two of them. It would be a waste of resources to always load all items.

But fortunately we have a solution for these kind of problems with NHibernate. It's called eagerly loading.

Eagerly loading with the NHibernateUtil class

If you know you need have access to related objects of the order entity you can use the NHibernateUtil class to initialize the related objects (that is: to fetch them from the database). Have a look at this test methods

[Test]
public void Can_initialize_customer_of_order_with_nhibernate_util()
{
    Order fromDb;
    using (ISession session = SessionFactory.OpenSession())
    {
        fromDb = session.Get<Order>(_order.Id);
        NHibernateUtil.Initialize(fromDb.Customer);
    }
 
    Assert.IsTrue(NHibernateUtil.IsInitialized(fromDb.Customer));
    Assert.IsFalse(NHibernateUtil.IsInitialized(fromDb.OrderLines));
}
 
[Test]
public void Can_initialize_order_lines_of_order_with_nhibernate_util()
{
    Order fromDb;
    using (ISession session = SessionFactory.OpenSession())
    {
        fromDb = session.Get<Order>(_order.Id);
        NHibernateUtil.Initialize(fromDb.OrderLines);
    }
 
    Assert.IsFalse(NHibernateUtil.IsInitialized(fromDb.Customer));
    Assert.IsTrue(NHibernateUtil.IsInitialized(fromDb.OrderLines));
}

With this utility class you can initialize single objects as well as collection of objects. In each case NHibernate will send 2 select statements to the database. One to select the order and one to initialize the related object(s).

Eagerly loading with HQL

If you know that you want to load all order items of a given order then you can tell NHibernate to do so and eagerly load all order lines together with the order in one go. The following test method shows how you can formulate a HQL query which not only loads the order but also the associated customer and order lines.

[Test]
public void Can_eagerly_load_order_aggregate_with_hql_query()
{
    Order fromDb;
    using (ISession session = SessionFactory.OpenSession())
    {
        string sql = "from Order o" +
                     " inner join fetch o.OrderLines" +
                     " inner join fetch o.Customer" +
                     " where o.Id=:id";
        fromDb = session.CreateQuery(sql)
                        .SetGuid("id", _order.Id)
                        .UniqueResult<Order>();
    }
    Assert.IsTrue(NHibernateUtil.IsInitialized(fromDb.Customer));
    Assert.IsTrue(NHibernateUtil.IsInitialized(fromDb.OrderLines));
}

The resulting sql generated by NHibernate is then similar to this one

select      order0_.Id as Id0_0_, 
            orderlines1_.Id as Id1_1_, 
            customer2_.Id as Id2_2_, 
            order0_.OrderNumber as OrderNum2_0_0_, 
            order0_.OrderDate as OrderDate0_0_, 
            order0_.CustomerId as CustomerId0_0_, 
            orderlines1_.Amount as Amount1_1_, 
            orderlines1_.ProductName as ProductN3_1_1_, 
            customer2_.CompanyName as CompanyN2_2_2_, 
            orderlines1_.OrderId as OrderId0__, 
            orderlines1_.Id as Id0__ 
from        Orders order0_ 
inner join  OrderLine orderlines1_ on order0_.Id=orderlines1_.OrderId 
inner join  Customer customer2_ on order0_.CustomerId=customer2_.Id 
where       order0_.Id='409ebd99-3206-459b-bfed-6df989284da9'

NHibernate has created an SQL select statement which joins the 3 tables involved, namely Orders, Customer and OrderLine. The returned (flat) set of records is then used by NHibernate to build up the object tree with the order entity as a root.

Aggregates in the Domain

DDD defines the concept of aggregates. A short definition of an aggregate is "A cluster of associated objects that are treated as a unit for the purpose of data changes.". An aggregate always has a root. In this context we can define the following aggregate in our domain

image

The order entity is the root and the order lines belong to the aggregate (can be regarded as children of the root). When creating a new order or changing an existing one we only want to modify either the order itself or its order lines. We certainly do not want to change the customer entity because this would be a completely different use case and does not belong to the order management use case.

So, when dealing with aggregates we often want to load the complete aggregate in one go! This is the perfect example for using eager loading techniques.

Summary

I have introduced the concept of lazy loading as provided by NHibernate. I have discussed the consequences and shown how to avoid negative side effects by using different techniques of so called eager loading.

Blog Signature Gabriel

.

Print | posted on Thursday, April 03, 2008 11:22 PM

Comments on this post

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Nice article ...

Have you succeeded applying Coarsed-grained locking on aggregates using NHibernate ?

I've been trying for some time now but couldn't find a decent solution yet.
Left by Steve Degosserie on Apr 04, 2008 2:22 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Hi there, you had written the far easiest to understand articles on nhibernate which would be suitable for a lot of beginners of nhibernate. And it is based on the new alpha. Thumbs up and thanks for sharing. Looking forward for more of your articles on nhibernate :)
Left by Chua Wen Ching on Apr 04, 2008 3:40 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
@Steve: can you explain a little more detailed what you exactly want to achieve?
Left by Gabriel Schenker on Apr 04, 2008 3:46 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
@Chua: thanks for the flowers! Expect more articles to follow soon...
Left by Gabriel Schenker on Apr 04, 2008 3:50 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
I'd like optimistic locking (version / timestamp) on the aggregate root only, and if a child entity (OrderLine) is modified, I'd like the version / timestamp to be updated on the aggregate root.
It seems this behavior is not supported natively ...
Left by Steve Degosserie on Apr 04, 2008 11:11 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Great post! Is it possible to use the SetFetchMode (...) in the Criteria API to achieve the same results?
Left by Tim Gifford on Apr 04, 2008 6:24 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
@Tim: currently Criteria API has a bug (it's in the JIRA). That's the reason I haven't shown it here in this article. I'll update the post as soon as the bug is fixed.
Left by Gabriel Schenker on Apr 04, 2008 11:14 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Gabriel, another superb article...keep them coming!
Left by Sean Kearon on Apr 05, 2008 7:08 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Thanks for this excellent article!

Another way to optimize the lazy loading behaviour is by setting the batch-size attribute in the mapping file. I think the great advantage of this approach, in contrary to the examples you showed in your article, is that the repository does not have to be aware of how the retrieved collection will be used in the application process. Do you know if there are any drawbacks of using the batch-size attribute? Do you also know how to determine the optimal batch-size setting?

Thanks in advance.
Left by Ronald van Leuwen on Apr 05, 2008 8:38 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
@Ronald: when I do DDD then I identify aggregates in my domain. In a use case I then modify such an aggregate as a whole. Thus I know exactly what data I need to load from the database. It makes sense to define a specific repository method which completely and eagerly loads an aggregate.
On the other hand using batch-size is a more generic approach to optimize loading of data and is not specific to a single use case. Since it is a generic approach you should keep the number reasonably small to avoid always loading much data even if you only need a single record
Left by Gabriel Schenker on Apr 05, 2008 9:16 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Gabriel, thanks for your quick response.

I agree with you. In the average application there is need for both specific queries for a seperate use case and more generic queries used for multiple use cases. A combination of all fetching strategies really improves performance. I love NHibernate for that!

At my current project I work with NHibernate 1.0.4.0, which does not support eager fetching of more than one collection of associated objects. Does 2.0 support that?

In the unit test Show_n_plus_1_select_behavior() you show what happens when iterating through the order lines of 1 order. I think the n plus 1 problem really shows up when you do something like this:


[Test]
public void Show_n_plus_1_select_behavior()
{
using (ISession session = SessionFactory.OpenSession())
{
ICollection<Order> fromDb = session.GetOrdersForDelivery();
foreach (Order order in fromDb)
{
int sum = 0;
foreach (OrderLine line in order.OrderLines)
{
// just some dummy code to force loading of order line
sum += line.Amount;
}
}
}
}


In that case you'll see 1 query which loads all the orders and n queries to load each separate collection of orderlines.
Left by Ronald van Leuwen on Apr 05, 2008 10:36 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
@Ronald: no, NHibernate 2.0 does not support the eager loading of more than one associated collection! But you can use different techniques to achive the desired result with MultiCriteria.
I'll write a post about that later...
Left by Gabriel Schenker on Apr 05, 2008 11:18 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Thank you for the great articles on NHibernate. Not only the are great, but also digestible for newbies like myself. Many thanks!
Left by Sean Feldman on Apr 06, 2008 9:53 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Hi

I have tried out what you mentioned as a part of lazy loading for both version of nHibernate . But it never seems to work since I get both the associated objects loaded. I mean i can see one order and and ten orderlines loaded when i do a get.Am I missing something.
Left by Goblin on Jul 01, 2008 9:38 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
@Goblin: did you try to use the same mappings as in the post? Did you use NHibernate 2.0?
For NH 2.0 (and if I remember correctly also NH1.2) lazy loading is the default setting. Have you (by accident) changed the default setting
Left by Gabriel Schenker on Jul 01, 2008 11:47 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Hi can you let us know what software that db was modeled in? I'd like to have drawings as nice as the ones in your screenshots, but can't find anything that good.
Left by Dan V on Aug 13, 2008 1:39 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
@Dan V: it's just the class designer of Visual Studio. Nothing special...
And: I do not model the database but let the database schema be generated by the nhibernate schema generation helper (have a look at my post about creating and updating schemas)
Left by Gabriel Schenker on Aug 13, 2008 3:35 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Hi,

Great articles, thanks. I'm new to NHibernate and this is really helpful.

I am having one problem on the first test. The Assert on Customer is ok, but the Assert on OrderLines fails.

In my Order class, I have defined an OrderLines property as below. I'm new to this, so not sure if I'm implementing collections properly or not: -

private ISet _orderLines = new HashedSet();
public virtual ISet OrderLines {
get { return _orderLines; }
set { value = _orderLines; }
Left by Andrew Duncan on Oct 16, 2008 7:37 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Another of your articles resolved my problem - I changed code to initialize the private variable in the constructor and changed to generics.
Left by Andrew Duncan on Oct 16, 2008 8:14 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Great article. One nitpick however is that you don't go into what type of collection should be used in the Order class for the OrderLines collection. This is very confusing for a new NHibernate user.
Left by Daniel Auger on Feb 07, 2009 10:40 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Follow-up: as Andrew did, I got it sorted out with this entry: blogs.hibernatingrhinos.com/.../...ate-part-1.aspx

You may want to put a reference to that material in this post to save people some confusion.

Thanks for the great work you are doing here :)
Left by Daniel Auger on Feb 07, 2009 10:50 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
I completely agree with the above comment, the internet is with a doubt growing into the most important medium of communication across the globe and its due to sites like this that ideas are spreading so quickly.
Left by Spielautomaten im Internet spiel on Nov 11, 2009 12:42 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Really very nice articles, thank you sir.
Left by work at home opportunities on Nov 27, 2009 12:54 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Great article. One nitpick however is that you don't go into what type of collection should be used in the Order class for the OrderLines collection. This is very confusing for a new NHibernate user.
Left by Shared Web Hosting on Dec 20, 2009 8:09 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Thumbs up and thanks for sharing. Looking forward for more of your articles on nhibernate :)
Left by pandora jewelry on Dec 24, 2009 11:55 PM

# Mr

Requesting Gravatar...
best info ever thanks
Left by make money online on Jan 16, 2010 1:11 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Thank you for the great articles on NHibernate. Not only the are great, but also digestible for newbies like myself. Many thanks!Very Nice.
Left by Love poetry on Jan 17, 2010 2:41 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Thanks for this post- I was looking for NHibernateUtil.Initialize for a while. Just what i needed. !!!!!

Dan
Left by King of all Heavy Metal on Jan 20, 2010 7:50 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Looking forward for more of your articles
Left by snoring remedies on Feb 04, 2010 8:27 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
I will forward this article to him. Pretty sure he will have a good read. Thanks for sharing!
Telecommunication degree | Web Development degree | Criminal Justice degree | Online Policing degree | health science school
Left by siomy on Feb 09, 2010 10:00 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
i got better explanation
Left by jothiram on Feb 11, 2010 10:53 PM

# priston tale Gold

Requesting Gravatar...
Do you knowpriston tale Gold?if you play the online game,you will knowpriston tale eonsis the game gold. In the game,if you had morebuy priston tale eons,you will had a tall level. But if you wantcheap priston tale Gold,you can come here and spend a little money to boughtpriston tale money .Quickly come here.
Left by priston tale Gold on Feb 24, 2010 1:23 PM

# discount Ugg Broome Boots in chestnut leather online sales

Requesting Gravatar...
YS0225A8 Before there was no reason in the world,As now there is!The moncler jackets course of water was my only course,My repetitions oceans' sough and swell ugg adirondack boots!My seasons pleasurable,Before there was no reason in the world,As now there is ugg broome boots!To measure time from sleep I rose to sleep,To measure space I pastured on surprise http://www.edhardy-buy.com/,O meadows of resemblances,was the grove on whose mosaic floors,The moncler online seeds of otherwise were spent,My gods had many arms,I was the Caesar of unmarshaled grass ugg boots!Faustus in the branches,My first ambitions were my sorrows long!Before there was no reason in the world,As now there is!
Left by discount womens moncler jacket on Feb 24, 2010 11:02 PM

# discount air jordan shoes 23 sales online

Requesting Gravatar...
YS0225A7 when the sun hugs the moon, the sky clses her eyes.when the sun hug the moon the sea quiet her jordans shoes.when the sun hugs the moon,the forest stops her susurrus.when the sun hugs the nike sb dunk high,the desert hodlds her breathe.Thousands of years's waiting is only for this nike acg shoes moment.Never be disappointed.Never give up.It hax been sucha long time.At nike air max 2003 this momentmeet each ther in course of time.Do not cry,Moon.I guard you forever.Cause you are in my life,everyting has its meaning.The fascinating Diamond Ring,is the ring i give you,May it give you warm http://www.nikejordanshoes2sell.com/ threduce your tears.Do not cry,Sun,I will be there with you forever/Meeting you has given me precious memeory.The resplendent Baily Beads.is the gem i give you .May i give you cheap air jordan 22 shoes strength, shine in your morning.Meet soon and part soon.It makes peop;e retrospect in spite of lasting a few minutes.A long times waiting is coming.Don't know when the next meeting is .When the sun hugs the Moon. the Moon hugs the sun as well Hugging tightly,regian the lost nicety.
Left by discount nike air max shoes sale on Feb 24, 2010 11:06 PM

# discount air jordan shoes 25 sales online

Requesting Gravatar...
YS0225A6 When you belive,Though hope is frail.It's hard to kill,Who knows what cheap prada shoes miracles,You can achieve,When you belive! Somehow you will,

You will when you belive new nike air max!And in this time of fear, When prayer so often proves in vain, Hope seemsike the http://www.nikeaf1jordanshoes.com/summer birds. Too swiftly flown away, And now I am standing wholesale gucci shoes here.My heart's so full I can't explain.Seeking faith and speaking women's nike shox words I never thought I'd say, They don't always happen when you ask authentic air jordan shoes.And it's easy to give in to your fear. But when you're blinded by your pain!
Left by discount mens moncler down coat on Feb 24, 2010 11:11 PM

# discount ed hardy women long sleeve shirts sales online

Requesting Gravatar...
YS0225A5 If you think you are beaten, you are! If you think you dare noted hardy clothing, you don't! If you want to win but think you can't, It's almost a cinch you won't ed hardy hoodies! If you think you'll lose,you're lost! For out of the world we find.Success begins with a fellow's will,It's all in a ed hardy shirts state of mind! Life's battles don't always go.To the stronger and faster ed hardy coats man,But sooner or later the man who wins,Is the man who thinks he can! When You Belive http://www.edfashionclothes.com/,Many night we've prayed!With no proof anyone cld hear!In our heart a hopeful moncler online store song,we barely understood!Now we are not afraid !Although we know there's much to fear!We were moving the moncler jackets mountian long,Before we knew we could!There can be miracles!
Left by discount mens moncler down coat on Feb 24, 2010 11:14 PM

# discount christian louboutin sandals online sales

Requesting Gravatar...
YS0226A1 That your heart has been broken,Hear the ords,I'm here, my child,;And know your christian louboutin uk angel has spoken.For even in the darkest hour,When all of discount louboutin shoes hope seems gone,They'll give you strength to live your life,And desire to go on.And if your faith in Heaven, Should ever fade away,They'll help renew your christian louboutin boots spirit, And help you find your way.Even though you're ever filled with doubt, About the christian louboutin pumps life you live,Know that they are there to give you All that they can give.For you see, the Father sent them,Because to Him, you mean so much,That He sent them just for you,my louboutin sale friend,And your life, they will touch.They will always be here,They will never leave your http://www.christianlouboutinshoestore.com/ side;And upon their strength and guidance,You always may rely.Take comfort in their guidance, Draw strength from up above,And know that their sweet presence,Is God's precious gift of love.
Left by cheap christian louboutin shoes on Feb 25, 2010 3:32 PM

# discount women's ugg elsey boots 5596 sales online

Requesting Gravatar...
YS0226A2 If I were a boy again, I would pracce perseverance more often, and never give up a thing because it was ugg australia boots or inconvenient. If we want light, we must conquer darkness. Perseverance can sometimes equal genius cheap ugg boots in its results. “There are only two creatures,” syas a proverb, “who can surmount the pyramids—the eagle and the snail.” If I were a uggs sale boy again, I would school myself into a habit of http://www.topsnowboots.com/ attention; I would let nothing come between me and the subject in hand. I would remember that a good skater never tries to skate in two ugg cardy boots directions at once. The habit of attention becomes part of our life, if we begain early enough. I often hear cheap gucci shoes grown up people say “ I could not fix my attention on the sermon or ugg coquette book, although I wished to do so” , and the reason is, the habit was not formed in youth.
Left by cheap ugg upside boots 5163 on Feb 25, 2010 3:39 PM

# discount Women's ugg adirondack boots II sales online

Requesting Gravatar...
YS0226A3 Hold fast to dreams.For if dreams die. Lfe is a broken-winged bird,That ugg australia boots can never fly.Hold fast to dreams. For when dreams go,Life is a barren ugg tall boots field, Frozen only with snow !You never know until you try; And you never try unless you really try ugg cardy boot. You give it your best shot; You do the best you can. And if you have done everything http://www.uggsnowbootsbest.com/! In your power,and still,The truth of the uggs argyle knit matter is! That you haven\'t failed at all.When you reach for your dreams,No matter what ugg boots they may be,You grow from the reaching;You learn from the trying;You win from the doing.
Left by cheap ugg classic cardy boots on Feb 25, 2010 3:47 PM

# discount reebok nfl jerseys online sales

Requesting Gravatar...
YS0226A4 A true friend is someone who reaches for your hand an touches your cheap hockey jerseys heart.There's always going to be people that hurt you,so what you have to do is keep on trusting nfl jerseys and just be more careful about who sport jerseys you trust next time around.Make youself a better person and know who you are discount nba jerseys before you try and know someone else and expect them to know you mlb jerseys on sale.Remember:Whatever happens,happens for a reason.How many people actually have 8 true http://www.nfljerseymlb.com/friends Hardly anyone I know.But some of us have all right friends and good friends.
Left by cheap adiads nba jerseys sale on Feb 25, 2010 3:51 PM

# discount ugg sienna miller boots 5818 sales online

Requesting Gravatar...
YS0226A9 Unwearied still, lover by lover,They dle in the cold,Companionable ugg australia shoes streams or climb the air;Their hearts have not grown old;ugg coquette Passion or conquest, wander where they will, Attend upon them still ugg adirondack boots. But now they drift on the still water, Mysterious, beautiful; Among what http://www.uggboots4buy.com/ rushes will they build, By what lake’s edge or pool,Delight men’s mbt shoes eyes when I awake some day.To find they have flown uggs classic cardy away?Before there was no reason in the world As now there is I was the bough bent easy by a ugg boots bird I was the vague blue-grazing flock The sleeping and invisible!
Left by cheap women's ugg elsey boots on Feb 25, 2010 3:56 PM

# discount mens air jordan shoes 13 online sales

Requesting Gravatar...
YS0226A10 When you are old and gray and full of sleep,And nodding b the moncler jackets fire, take down this book! And slowly read jordans sheoes , and dream of the soft look,Your eyes had once, and of their cheap nike shoes shadows deep;How many loved your moments of glad grace,And loved your beauty with nike air force 1 love false or true; But one man loved the pilgrim soul in you,And http://www.onestop-onlineshopping.com/ loved the sorrows of your changing face; And bending down beside the designer clothing glowing bars,Murmur, a little sadly, how love fled.And paced upon the mountains overhead discount air jordan shoes,And hid his face amid a crowd of stars.
Left by cheap nike air max 90 online on Feb 25, 2010 4:01 PM

# discount louis vuitton damier canvas handbags online sales

Requesting Gravatar...
YS0226A11 Surrounding you are angels,They are there to guide your path.If designer purses weaesskn overcomes you,They'll give you strength if you will ak. They are your protection.When discount designer bags on sale life seems too hard to bear,And though you feel alone at times, The louis vuitton 2009 angels ... they are there.Their faces may be hidden And their voices you might not hear,But they are ALWAYS with you,Through your laughter or your tears.http://www.handbags4buy.com/ They'll walk along beside you,They'll guide your leather handbags steps along the way, They'll comfort you and hold you,Protect you dior handbags night and day.They'll hold to your hand tightly ,They'll not ever let it go,And they'll gently lead you cheap designer handbagsforward,Taking each step very slow.For even as you slumber,They watch closely over you;They are there beside you. In each and every thing you do.
Left by cheap nike air max 90 online on Feb 25, 2010 4:07 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...

wedding dresses,wedding gowns,bride dresses,bridesmaids dresses,evening dresses,bridal gowns,flower girl dresses
Wedding Gowns
Formal Gowns
Cocktail Gowns
Find the wedding dress designer and wedding dress that's right for you! Browse dresses from
Bridesmaid Gowns
Evening Gowns
View our selection of exquisite, handmade gowns and dresses for your wedding
Wedding Dresses, Wedding Shoes and Wedding Accessories from wedding shop, the UK's finest collection of designer wedding dresses.
Use the wedding dress and
cheap wedding
wedding dresses
wedding shop
rtyu
Left by sbb on Feb 27, 2010 10:12 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Useful information like this one must be kept and maintained so I will put this one on my bookmark list! Thanks for this wonderful post
Left by Pest Control Fairfax on Mar 01, 2010 11:27 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
They watch closely over you;They are there beside you. In each and every thing you do.
Left by crystallized on Mar 02, 2010 1:06 AM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...

wedding dresses,wedding gowns,bride dresses,bridesmaids dresses,evening dresses,bridal gowns,flower girl dresses
Wedding Gowns
Formal Gowns
Cocktail Gowns
Find the wedding dress designer and wedding dress that's right for you! Browse dresses from
Bridesmaid Gowns
Evening Gowns
View our selection of exquisite, handmade gowns and dresses for your wedding
Wedding Dresses, Wedding Shoes and Wedding Accessories from wedding shop, the UK's finest collection of designer wedding dresses.
Use the wedding dress and
cheap wedding
wedding dresses
wedding shop


yui
Left by sbb on Mar 02, 2010 8:09 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Just wanted to give you a shout from the valley of the sun, great information. Much appreciated.
Left by Christian Time Management on Mar 02, 2010 10:22 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Great blog, just looking around some blogs, seems a pretty nice platform you are using. I'm currently using Wordpress for a few of my sites but looking to change one of them over to a platform similar to yours as a trial run. Anything in particular you would recommend about it?
Left by Ceramic Fibre Rope on Mar 02, 2010 10:24 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Thanks for taking the time to discuss this,would you mind updating your blog with more information? It is extremely helpful for me
Left by Natural Baby Products on Mar 02, 2010 10:24 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog. I am sure my visitors will find that very useful
Left by Sofa Fabric uk on Mar 02, 2010 10:25 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
I just wanna thank you for sharing your information and your site or blog this is simple but nice article I've ever seen i like it i learn something today.
Left by Silk flowers on Mar 02, 2010 10:26 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
I love reading and I am always searching for informative information like this! You are bookmarked!
Left by Folding Bikes on Mar 02, 2010 10:27 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
thanks… I’ve been bookmarking them for a while now and just decided to create a post to provide them to others…
Left by Personalised Gift Bags on Mar 02, 2010 10:28 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Just wanted to give you a shout from the valley of the sun, great information. Much appreciated.
Left by ucvhost on Mar 06, 2010 2:55 AM

# ugg boots

Requesting Gravatar...


they are very good and useful!!!
ugg outlet
cheap uggs
nike shoes
wholesale watches 896
Left by ugg boots on Mar 07, 2010 5:30 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
fw It’s hard to find knowledgeable people on this topic, but you sound like you know what you’re talking about! Thanks Don’t stop writing, you’ve given me lots of good info! Youtube to MP4 Converter
Convert PDF to image
Left by powerpoint on Mar 08, 2010 2:13 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
I have bookmark it!hope for your arctical more!My hair is just over my ears. I like two kinds of hair styles most. Firstly, use the ghd straighteners to make

the hair in nature and bouffant style. Divide the hair into several portions. Use ghd pink to roll them inside

towards your ears. Several minutes later, the hair will roll neatly inside in the branches. Secondly, the active and energetic style with the roll of the

direction in the opposite direction can be made similarly with the formal procedure. All you need to do is to roll the hair outward instead of inward

with ghd mk5.
It is so simple that you can have your own charming short hair style with GHD straightener uk. Besides the new hair styles,ghd straighteners can help you with the puffy hair after you get up which is the annoying thing for many short hair

girls.
So as long as I have the good tool of ghd pink, no matter what the fashion trend goes of hair styles, I will

stick into my favorite neat short hair.


Left by ghd straighteners on Mar 09, 2010 3:37 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
Firstly I will talk about UGG boots' Origin. cheap ugg boots has been created in Australia during the First World War, by the Australian pilot, who wrapped in sheep's clothing with two feet into the shoes to protect from the cold weather. Then it gradually became popular in Australia. Initially the name came in, called ugg boots sale which means ugly shoes. Later, Australians nicknamed it ugg boots deutschland. Until shenmai zai mei suo bu da meiya pingyuan1994, an American registered the trademark of UGG Australia, and began to produce UGG boots in a large scale. Today, ugg Australia is a very popular brand in the world.
Left by cheap ugg on Mar 10, 2010 6:30 PM

# re: Lazy Loading - Eager Loading

Requesting Gravatar...
I like this article. Very informative. I am sure a lot of people will benefit from it. Thanks!
Left by Chapel Hill Real Estate on Mar 10, 2010 7:51 PM

Your comment:

 (will show your gravatar)
 
Please add 2 and 6 and type the answer here: