about the 2 seperate queries, you can map your collection with a batch-size="X" , if you have a pretty good idea on how many root entities your gonna fetch in the first query, and nhibernate will automatically, when lazy loading one association, will also load the associations of X other root entities, so it will result in one query per X entities, instead of a query per entity. as of V3, hopefully, you'll be able to set the batch size per session (and not only in the mappings).
if you don't think that batch size will work for you (as it will batch X entities, and not all of them), you can read this blog post: http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx or set a very big batch size (which might not be ok in mappings, but if and when you could do it per session, i think it will be a good practice). <http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx> On Tue, Sep 7, 2010 at 8:07 PM, Calin <[email protected]> wrote: > Hi Nadav, > > "you can actually just query for the products of all you're > entities," This looks the most appealing, how do I actually do this ? > You mean I shoud call a FetchAll for entities and FetchAll for > products and then the lazy loader for entities will now how to load > entity.Products based on the collection that I fetched previously ? > > "by the way, why don't you put your domain business logic inside your > nhibernate mapped entities? " > Yes, why don't I ? It has something to do with my business layer, I > find it very hard to map collections into my business object, I use > CSLA, and there are some issues here specific to my application. > > On Sep 7, 5:22 pm, nadav s <[email protected]> wrote: > > hi Calin. The main performance issue with your code isn't lake of use of > > your multi core proccessor, but a classical N+1 problem. > > > > you're enumerating an enumeration of entities, lazy loading their > > collection, now unless you have set a big batch size, if you have 100 > > entities, and you are have one one-to-many relationship, you're gonna > have > > here 101 queries (thus N+1) - one for the entities (the previous query) > and > > 1 query per a returned entity. > > > > you can actually just query for the products of all you're entities, and > > then you'll have only 2 queries, one fetching the entities, and one > fetching > > the products. > > > > by the way, why don't you put your domain business logic inside your > > nhibernate mapped entities? > > > > On Tue, Sep 7, 2010 at 4:28 PM, Graham Bunce <[email protected] > >wrote: > > > > > > > > > > > > > > > > > ... however if you did want to do this then you'd need some framework > > > to manage the sessions for you. > > > > > the best way may be to wrap each Create within a method that manages > > > the session for you e.g. (semi pseudo-code) > > > > > Parallel.ForEach(() => { ServiceLayer.Create(entity); }; > > > > > ServiceLayer.Create<T>(T entity) > > > { > > > try > > > { > > > NH.Session.Open(); > > > //Do Stuff > > > } > > > finally > > > { > > > NH.Session.Close(); > > > } > > > } > > > > > Or something along these lines. Make sure that the entity you pass is > > > either a DTO (safer IMO) or you attach it to the new session within > > > the Create method. There may be some quirks with the latter though. > > > I've done some multi-threaded stuff with NH but not a huge amount so > > > there might be a problem with the above... but I've done something > > > similar myself and, so far, no issues I've come across. > > > > > -- > > > You received this message because you are subscribed to the Google > Groups > > > "nhusers" group. > > > To post to this group, send email to [email protected]. > > > To unsubscribe from this group, send email to > > > [email protected]<nhusers%[email protected]> > <nhusers%[email protected]<nhusers%[email protected]>> > > > . > > > For more options, visit this group at > > >http://groups.google.com/group/nhusers?hl=en. > > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]<nhusers%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=en. > > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.
