Loading a complex object graph

Lately I had the joy to load a complex object graph from a (legacy) MS Access database. Some findings:

  • MS Access does not support the multi-query or multi-criteria API.
  • My first implementation using lazy load was very very slow since it created way to many database hits

The domain model

Let's have a look at the (simplified) domain model. The object graph I am talking about represents a chart with several data series in it. Each data series (or curve) consists of one to many segments. Between two successive segments there is always a segment transition.

image

In this simplified model I only have one curve in my chart. Each segment of the curve has some additional segment data and plot details. All but the last segment of the curve have also a transition (to a next segment). The transition also has plot details. Each segment and transition have a collection of data points. The SegmentPoint and TransitionPoint classes contain some additional data like a sort index, whether or not the data point is active or not, etc.

Now I can load this object graph in a default way and make it populate by NHibernate (which in turn uses lazy loading), or I can tune my NHibernate queries and use eager loading to populate the object graph.

Assume that my curve has 3 segments (and thus 2 transitions between the segments) and a total of 20 data points (distributed to the 3 segments and 2 transitions).

Using Lazy Loading

Let us use lazy loading as below

int chartId = ...;  //some id
var chart = _session.Get<Chart>(chartId);
DumpChart(chart);

Note that the DumpChart() method just transverses the whole object tree an accesses some of the properties of each object. This causes the objects to be (lazy) loaded if necessary.

In doing so I get A LOT of queries hitting the database! In total I have counted the incredible number of 35 select statements. If my curve would have had more segments and more data points the situation would have been even worse!

NHibernate: SELECT chart0_.Id as Id0_0_, chart0_.MainCurveId as MainCurv2_0_0_ FROM Chart chart0_ WHERE chart0_.Id=@p0; @p0 = '1'
NHibernate: SELECT curve0_.Id as Id1_0_, curve0_.Name as Name1_0_ FROM Curve curve0_ WHERE curve0_.Id=@p0; @p0 = '1'
NHibernate: SELECT segments0_.CurveId as CurveId1_, segments0_.Id as Id1_, segments0_.Id as Id2_0_, segments0_.Name as Name2_0_, segments0_.TransitionId as Transiti3_2_0_, segments0_.SegmentDataId as SegmentD4_2_0_, segments0_.PlotDetailsId as PlotDeta5_2_0_ FROM Segment segments0_ WHERE segments0_.CurveId=@p0; @p0 = '1'
NHibernate: SELECT points0_.SegmentId as SegmentId1_, points0_.Id as Id1_, points0_.Id as Id5_0_, points0_.DataPointId as DataPoin2_5_0_ FROM SegmentPoint points0_ WHERE points0_.SegmentId=@p0; @p0 = '1'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '1'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '2'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '3'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '4'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '5'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '6'
NHibernate: SELECT plotdetail0_.Id as Id4_0_, plotdetail0_.LineColor as LineColor4_0_ FROM PlotDetails plotdetail0_ WHERE plotdetail0_.Id=@p0; @p0 = '1'
NHibernate: SELECT segmentdat0_.Id as Id8_0_, segmentdat0_.Data as Data8_0_ FROM SegmentData segmentdat0_ WHERE segmentdat0_.Id=@p0; @p0 = '1'
NHibernate: SELECT transition0_.Id as Id3_0_, transition0_.Name as Name3_0_, transition0_.PlotDetailsId as PlotDeta3_3_0_ FROM Transition transition0_ WHERE transition0_.Id=@p0; @p0 = '1'
NHibernate: SELECT points0_.TransitionId as Transiti3_1_, points0_.Id as Id1_, points0_.Id as Id6_0_, points0_.DataPointId as DataPoin2_6_0_ FROM TransitionPoint points0_ WHERE points0_.TransitionId=@p0; @p0 = '1'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '7'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '8'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '9'
NHibernate: SELECT points0_.SegmentId as SegmentId1_, points0_.Id as Id1_, points0_.Id as Id5_0_, points0_.DataPointId as DataPoin2_5_0_ FROM SegmentPoint points0_ WHERE points0_.SegmentId=@p0; @p0 = '2'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '10'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '11'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '12'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '13'
NHibernate: SELECT plotdetail0_.Id as Id4_0_, plotdetail0_.LineColor as LineColor4_0_ FROM PlotDetails plotdetail0_ WHERE plotdetail0_.Id=@p0; @p0 = '3'
NHibernate: SELECT segmentdat0_.Id as Id8_0_, segmentdat0_.Data as Data8_0_ FROM SegmentData segmentdat0_ WHERE segmentdat0_.Id=@p0; @p0 = '2'
NHibernate: SELECT transition0_.Id as Id3_0_, transition0_.Name as Name3_0_, transition0_.PlotDetailsId as PlotDeta3_3_0_ FROM Transition transition0_ WHERE transition0_.Id=@p0; @p0 = '2'
NHibernate: SELECT points0_.TransitionId as Transiti3_1_, points0_.Id as Id1_, points0_.Id as Id6_0_, points0_.DataPointId as DataPoin2_6_0_ FROM TransitionPoint points0_ WHERE points0_.TransitionId=@p0; @p0 = '2'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '14'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '15'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '16'
NHibernate: SELECT points0_.SegmentId as SegmentId1_, points0_.Id as Id1_, points0_.Id as Id5_0_, points0_.DataPointId as DataPoin2_5_0_ FROM SegmentPoint points0_ WHERE points0_.SegmentId=@p0; @p0 = '3'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '17'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '18'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '19'
NHibernate: SELECT datapoint0_.Id as Id7_0_, datapoint0_.X as X7_0_, datapoint0_.Y as Y7_0_ FROM DataPoint datapoint0_ WHERE datapoint0_.Id=@p0; @p0 = '20'
NHibernate: SELECT plotdetail0_.Id as Id4_0_, plotdetail0_.LineColor as LineColor4_0_ FROM PlotDetails plotdetail0_ WHERE plotdetail0_.Id=@p0; @p0 = '5'

But fortunately I can do better!

Using Eager Loading

By using eager loading I can reduce the number of queries down to 3 (in this simplified sample). That's a factor of 10! How do I do that? Here is the code

var chartId = ...;    // some id of an existing chart
var chart = _session.CreateQuery("from Chart chart" +
                                 " inner join fetch chart.MainCurve mc" +
                                 " left join fetch mc.Segments s" +
                                 " left join fetch s.SegmentData sd" +
                                 " left join fetch s.PlotDetails spd" +
                                 " left join fetch s.Transition t" +
                                 " left join fetch t.PlotDetails tpd" +
                                 " where chart.Id=:id")
    .SetInt32("id", chartId)
    .UniqueResult<Chart>();
 
var chart2 = _session.CreateQuery("from Chart chart" +
                                  " inner join fetch chart.MainCurve mc" +
                                  " left join fetch mc.Segments s" +
                                  " left join fetch s.Points sp" +
                                  " left join fetch sp.DataPoint dp" +
                                  " where chart.Id=:id")
    .SetInt32("id", chartId)
    .UniqueResult<Chart>();
 
var chart3 = _session.CreateQuery("from Chart chart" +
                                  " inner join fetch chart.MainCurve mc" +
                                  " left join fetch mc.Segments s" +
                                  " left join fetch s.Transition t" +
                                  " left join fetch t.Points tp" +
                                  " left join fetch tp.DataPoint dp" +
                                  " where chart.Id=:id")
    .SetInt32("id", chartId)
    .UniqueResult<Chart>();
 
In the first query I load the curve with all its segments and transitions. I also load the additional segment data of each segment and the plot details of each segment and each transition.

In the second query I load all the data points assigned to each segment of the curve.

And in the third query I load all the data points assigned to each transition of the curve.

When I now call the DumpChart() method NO additional query is generated by NHibernate since the object graph is already fully populated by the above 3 queries.

Please note: the variables chart, chart2 and chart3 in the above code represent all the same object. NHibernate recognizes this since the 3 queries are all referencing the same chart object (that is: the chart object with the same id).

Sample Code

As usual you can find the code to this sample here.

Summary

NHibernate provides us an easy way to populate even a very complex object graph by using lazy loading. One just has to navigate through the object graph and when accessing a specific object (or its properties) NHibernate dynamically populates the object from the database if needed. The disadvantage of this is that NHibernate possibly generates a huge number of database requests until the whole object graph is fully populated.

By using the eager loading techniques provided by NHibernate I could dramatically improve the speed to populate a complex object graph.

Enjoy

Blog Signature Gabriel .

Print | posted on Tuesday, May 06, 2008 10:29 PM

Comments on this post

# re: Loading a complex object graph

Requesting Gravatar...
Hi Gabriel,

isn't it helpful to set the batch size for lazy loaded objects. That will reduce the database round trips also.

Regards
Left by Dirk on May 06, 2008 11:55 PM

# re: Loading a complex object graph

Requesting Gravatar...
@Dirk: yes, one can also "play" with the batch size to reduce the number of queries produced. But I prefer to eager load the object graph.
Left by Gabriel Schenker on May 07, 2008 12:07 AM

# re: Loading a complex object graph

Requesting Gravatar...
Gabriel,

I have to say that I disagree with this recommendation. Eagerly fetching this many relationships should be considered long and hard before doing it. Keep in mind that when doing an eager fetch you are effectively just doing an inner join sql query and then parsing the resulting table in C#.

Now lets say for simplicity that your chart class has 10 properties with an average size of 20 bytes. You have one main curve (obviously), the main curve has 20 segments, each segment has 20 sets of segment data, each segment data has 30 plot details, each segment has 10 transitions, each transition has 10 plot details.

The result of this query will be that the 200 bytes of data for the single chart will be repeated 20 * 20 * 30 * 10 * 10 = 1.2 Million times! The resulting size of the data (not including all of the data from the tables besides the chart) will be 240 MB.

The resulting result set would actually be much larger than that. Obviously transferring 240MB where all but 200 bytes is unnecessary duplication is less than ideal and just made the query performance far far worse than the result of running many queries.

I don't think the number of items in these collections are very large either.

All I want to say is that people should be careful when using this approach. In most cases you really do not want to eagerly fetch more than one or two collections. Usually I try to limit myself to just one.

Btw, for those who are curious, if we were to assume that each class was 10 properties each of about 20 bytes in size, the total result set of the query provided would be 252.622MB.
Left by John Chapman on May 07, 2008 1:06 PM

# re: Loading a complex object graph

Requesting Gravatar...
@John: I completely agree with you that one should think twice before using eager fetching. But in my situation it has improved the situation a lot. You might have noticed that I only eager load one (possibly big)collection at a time. These are the segment- and the transition points. On the other hand the number of segments is limited (always below 5) and so is the number of transitions (below 4). Each segment and each transition exactly has ONE plot-details (the size of each is less than 100 bytes) and each segment as exactly one segment data object (less that 200 bytes).

So your calculation is not correct for the sample given in the post!
On the other hand the situation you describe can arise if one does not pay attention to the given sample and tries to e.g. load several (possibly big) disjunct collection in one single query

But back to the sample of the post; let's see:

If we have one curve with 4 segments in the chart then the first query gives me

1 chart * 1 curve * 4 segments = 4 records (!)

even if each record is several kB in size this is no problem for the db (and the preformance)

If I now have 20 data points per segment and 10 per transition then the second and third query will consist of

1 chart * 4 segments * 20 data points = 80 records

1 chart * 4 segments * 1 transition * 10 data points = 40 records

again I see no problem.
Left by Gabriel Schenker on May 08, 2008 1:03 AM

# re: Loading a complex object graph

Requesting Gravatar...
Gabriel,

I'm not saying it can't work. I'm really trying to stress that this type of things should be avoided in most scenarios.

Additionally, I know you are aware of this (there was an e-mail to the effect) in your case all 3 chart objects are the same reference. You don't actually need 3 of them. This is a function of the identity map.
Left by John Chapman on May 08, 2008 6:24 AM

# re: Loading a complex object graph

Requesting Gravatar...
Hi John,

There is a third strategy for loading your object graph: subselects. By using it, you avoid the N+1 query problem - in fact, you will have a separate query for each entity - and you work around the exponential growth in size due to the duplication of the "denormalized" data.

Subselect fetching works quite well in NHibernate and it's my personal favorite. But, as with so many problems, the the optimal solution highly depends on the situation.
Left by Tolomaüs on May 12, 2008 8:02 AM

# re: Loading a complex object graph

Requesting Gravatar...
I just stumbled across your post and I think you have to take a look on your data.

If you do a eager fetch of

1 chart * 1 curve * 4 segments = 4 records (!)

these records will have a lot of columns which are identical for char and curve and only differ for the segments. If chart and curve would have many columns and segments would only have a few columns, that would result in a lot of unnecessary data.

So instead of doing a join I would fetch the chart and the curve with a separate select-statement each and then fetch all segments. OK - 4 records might not be worth it, but consider a couple a few dozens :).

I just tested something like that, so I took the sql-statements produced by NHibernate fetch-join vs. fetch-select) and looked at the client-stats (number of sql-statements, transfered bytes to client), and the fetch-select strategy does make a difference; especially in my scenario where I have a lot of columns in my "primary" entity, which would be repeated in each row ...
Left by henning on Aug 12, 2008 10:46 PM

# re: Loading a complex object graph

Requesting Gravatar...
@henning: as always: the optimal fetch strategy depends on the context. For your context you are certainly right.
Left by Gabriel Schenker on Aug 13, 2008 3:38 AM

# re: Loading a complex object graph

Requesting Gravatar...
Wow, great post and thanks
Left by life insurance quotes on Dec 06, 2009 8:03 PM

# re: Loading a complex object graph

Requesting Gravatar...
Oh great! This can help me a lot in future requirements and tasks in ms access.
Left by Breast enlargement Philadelphia on Dec 22, 2009 9:10 AM

# re: Loading a complex object graph

Requesting Gravatar...
The resulting result set would actually be much larger than that. Obviously transferring 240MB where all but 200 bytes is unnecessary duplication is less than ideal and just made the query performance far far worse than the result of running many queries.
Left by pandora jewelry on Dec 24, 2009 11:56 PM

# re: Loading a complex object graph

Requesting Gravatar...
haha thats cool
Left by make money online on Jan 16, 2010 1:16 PM

# re: Loading a complex object graph

Requesting Gravatar...
Hi. I wanted to drop you a quick note to express my thanks. I've been following your blog for a month or so and have picked up a ton of good information as well as enjoyed the way you've structured your site. I am attempting to run my own blog but I think its too general and I want to focus more on smaller topics. Being all things to all people is not all that its cracked up to be.
Left by drawstring backpacks on Jan 26, 2010 6:51 AM

# re: Loading a complex object graph

Requesting Gravatar...
What's more, a bracelet can also be equipped with different small pandora jewelry and even you can change it according to your mood at any time. Here are some meanings of pendant. Small Plane stands for traveling and adventure ; anchor, stability and hope; your baby's boots, having a lot of babies; small feeding pandora bracelets abundant food; Church means happiness and stability of marriage; dragonfly means riches; Eiffel Tower means travel and exploration; four-leaf clover means fortune; horseshoe means luck; Nest means a happy family; bride shows a happy bride in her coming pandora jewelleryship steering shows calming and confidence; pandora ukcoin pandora beadsshows rich marriage life. Wish bone, dreams being about to come true; pandora charm bracelets, love; one heart shot by an arrow, romantic love; purse, wealth; and heart-shaped lock, true love.haha
Left by pandora jewelry on Jan 28, 2010 3:58 PM

# Mesothelioma victims

Requesting Gravatar...
Great post mate!
Left by Mesothelioma victims on Jan 30, 2010 8:51 PM

# re: Loading a complex object graph

Left by ugg boot on Feb 08, 2010 7:02 PM

# great

Requesting Gravatar...
Great you have done good job
Left by Glass on Feb 09, 2010 1:11 AM

# re: Loading a complex object graph

Requesting Gravatar...
Very well explained. Thank you.
Left by Elderly Life Insurance on Feb 09, 2010 6:37 AM

# re: Loading a complex object graph

Requesting Gravatar...
I'm the same way, I do my best to remain neutral. It's hard, if you communicate with the person the other person dislikes, then you fall out of favor with them! I simple can't dislike a person, just because someone else does, I just can't.
Natural science School | Political Science Degrees | Online Occupational safety and health degree | social service degree | Online Psychology School
Left by siomy on Feb 09, 2010 10:03 PM

# re: Loading a complex object graph

Requesting Gravatar...
Nice way to say our thought to others.
Left by Conveyancing Services on Feb 15, 2010 7:57 PM

# re: Loading a complex object graph

Requesting Gravatar...
your posting is excellent,helpful and provides extra knowledge. keep posting...
Left by conveyancing on Feb 17, 2010 12:00 AM

# re: Loading a complex object graph

Left by gucci shoes on Feb 21, 2010 2:14 PM

# re: Loading a complex object graph

Left by cheap picture frames on Feb 22, 2010 6:08 PM

# re: Loading a complex object graph

Requesting Gravatar...
NHibernate is an Object-relational mapping (ORM) solution for the Microsoft .NET platform: it provides a framework for mapping an object-oriented domain model to a traditional relational database.
Left by mosaic ceramic tiles on Feb 24, 2010 5:51 AM

# tales of pirates gold

Requesting Gravatar...
Do you knowtales of pirates gold?if you play the online game,you will knowbuy tales of pirates goldis the game gold. In the game,if you had moretop gold,you will had a tall level. But if you wantbuy top gold,you can come here and spend a little money to boughtcheap tales of pirates gold.Quickly come here.
Left by tales of pirates gold on Feb 24, 2010 1:24 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 w 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,I 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 10:59 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.Neer give up.It hax been sucha long time.At nike air max 2003 this momentmeet each other 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:03 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 seems like the http://www.nikeaf1jordanshoes.com/summer birds. Too swiftly flown away, An 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:08 PM

# discount ed hardy women long sleeve shirts sales online

Requesting Gravatar...
YS0225A5 If you think yu 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! Fr 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 could 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:12 PM

# discount christian louboutin sandals online sales

Requesting Gravatar...
YS0226A1 That your heart has been broken,Her the words,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:00 PM

# discount women's ugg elsey boots 5596 sales online

Requesting Gravatar...
YS0226A2 I I were a boy again, I would practice 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:01 PM

# discount Women's ugg adirondack boots II sales online

Requesting Gravatar...
YS0226A3 Hol fast to dreams.For if dreams die. Life 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:05 PM

# discount reebok nfl jerseys online sales

Requesting Gravatar...
YS0226A4 true friend is someone who reaches for your hand and 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:08 PM

# discount ugg sienna miller boots 5818 sales online

Requesting Gravatar...
YS0226A9 Unearied still, lover by lover,They paddle 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:12 PM

# discount mens air jordan shoes 13 online sales

Requesting Gravatar...
YS0226A10 Wen you are old and gray and full of sleep,And nodding by 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 3:15 PM

# discount louis vuitton damier canvas handbags online sales

Requesting Gravatar...
YS0226 11 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 ask. 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 3:25 PM

# re: Loading a complex object graph

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
fdsaf
Left by sbb on Feb 27, 2010 10:13 PM

# re: Loading a complex object graph

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


jjjj
Left by sbb on Mar 02, 2010 8:11 PM

# re: Loading a complex object graph

Requesting Gravatar...
your posting is excellent,helpful and provides extra knowledge. keep posting.
Left by ucvhost on Mar 06, 2010 2:43 AM

# ugg boots

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

# re: Loading a complex object graph

Requesting Gravatar...
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
32
Left by powerpoint on Mar 08, 2010 2:14 PM

# re: Loading a complex object graph

Requesting Gravatar...
I was very pleased to find this site.I wanted to thank you for this great read!! I definitely enjoying every little bit of it and I have you bookmarked to check out new stuff you post.NICE
cheap vps | cheap hosting
Left by ucvhost on Mar 10, 2010 11:39 PM

# re: Loading a complex object graph

Requesting Gravatar...
I like it!
Left by rolex on Mar 11, 2010 2:14 PM

Your comment:

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