Hmm. Just want be sure you're expecting caching to happen on the second time you access each of these structures, correct? I see you mention that for ClassA, but just like accessing ClassA, you won't get the collections and such that are children of ClassA (or the subclasses ClassB, etc) from the cache until you've retrieved those things once and taken the first hit on retreival... it doesn't get those things all at once when you retreive ClassA, even though you have a cache it still gets them and puts them into the cache lazily as you access your objects.
Note that you CAN get ClassA's children at the same time as you retreive ClassA, etc by setting the fetchmode to eager... if you always use ClassA's children with ClassA, this could be a good idea, one big db hit instead of a ton of small hits. Another thing - are any of these classes mapped with composite keys? Such classes can be set up to cache, but making sure it happens correctly is more involved than just putting on the cache tag. On Sat, Nov 14, 2009 at 3:17 PM, eigeneachse <[email protected]>wrote: > > Hi Anne, > thank you very much for the reply. I tried to follow your suggestions, > but my collections are not yet fetched from the SL Cache. So here is > what my structure looks like. > > ClassA -> Decorated with [Cache(Usage = CacheUsage.ReadWrite, Region = > "10Minutes")] > |_______> SubclassB -> Decorated with [Cache(Usage = > CacheUsage.ReadWrite, Region = "10Minutes")] > |_____________SubclassC -> Decorated with [Cache > (Usage = CacheUsage.ReadWrite, Region = "10Minutes")] > |_____________SubclassD -> Decorated with [Cache > (Usage = CacheUsage.ReadWrite, Region = "10Minutes")] > > So first of all, my classes are all decorated with the Cache Tag. Now > i have in my ClassA a OneToMany reference to SubclassB. This reference > is configured as follows > > [Bag(0, Lazy = true, Name = "SubclassB ", Cascade = "all", Fetch = > CollectionFetchMode.Unspecified)] > [Key(1, Column = "CLASSA_ID")] > [OneToMany(2, ClassType = typeof(SubclassB))] > [Cache(3, Region = "5Minutes", Usage = CacheUsage.ReadWrite)] > public virtual PersistentGenericBag<SubclassB> SubclassBList{ get; > set; } > > I hope this is correct. Now in SubclassB there are to more references. > To SubclassC and SubclassD. Both are ManyToOne references. I will show > you the configs. > > [ManyToOne(0, Name = "SubclassC", ClassType = typeof(SubclassC), > Column = "SUBCLASSC_ID", Cascade = "all", Fetch = > FetchMode.Unspecified)] > [Cache(1, Region = "5Minutes", Usage = CacheUsage.ReadWrite)] > public virtual SubclassC SubclassC{ get; set; } > > > [ManyToOne(0, Name = "SubclassD", ClassType = typeof(SubclassD), > Column = "SUBCLASSC_ID", Cascade = "all", Fetch = > FetchMode.Unspecified)] > [Cache(1, Region = "5Minutes", Usage = CacheUsage.ReadWrite)] > public virtual SubclassD SubclassD{ get; set; } > > Ok now i think every class an every collection is configured for > caching. But i have already hits to the db and i do not understand why > i have these hits. What am i doing wrong? Do you have any more hints > for me? > > Here is what i found in the nhibernate debug log. It firsts looks for > a cached collection of classA. An surprisingly i get an: > > ReadOnlyCache ThreadID=8: Cache hit > > This is what i see in my sql profiler. There is no second dbhit for > class a. Alright. > Now he is looking for a cached collection for SubclassB. The result > is: > > DefaultInitializeCollectionEventListener ThreadID=8: collection not > cached > > And here is what i see in my sql profiler. I get the dbhit. Why? For > SubclassC and D its the same behaviour. > > Anne you, and maybe an other professional, are my last hope to get an > success story out of this. Please let my know if you have any other > hints for me. > > Thanks in advance > > Regards > > eigeneachse > > On Nov 14, 5:12 am, Anne Epstein <[email protected]> wrote: > > Hi! Caching is a bit more difficult to get right than it seems initially. > > All entities you want cached should have the cache tag on them, and this > > includes your referenced object mappings. If you mark the entity you're > > referencing as cached, then you should be set for your many-to-one > > relationships, i.e. . If your query was for Dog and Dog has one > Owner(type > > Person) you would need to set the type Person to be cached to not get the > db > > hit when you traverse the dog-owner relationship. The reason you need to > > cache Person is because cached Dog only has the OwnerId in it, not a > whole > > Person. NH will index objects of type Person by that ID so if you have > > Person cached NH will grab it there instead of going to the DB. > > > > Traversing collections off your cached object is similar, but is a bit > more > > involved. Let's say your Dog had a collection of Puppies. Sure, you may > > have all Dog objects caching, but when it you have NH cache a Dog, it > only > > caches the things that are in that DB row. if you think about how > > collections are implemented in a database, the relationship to Dog isn't > in > > that Dog row, it's in the rows of each of the Puppies as a foreign key so > > it's not cached with Dog. Even if each of the puppies is cached, it's > that > > relationship FROM Dog TO the puppies that you need, and will get the > query > > hit for. Don't want that DB hit? there's an easy fix: put a cache tag > > *inside your collection definitions*, i.e. your lists, sets, bags. That > > will cache the *list of ids* of the puppies that Dog has. Your puppy > > objects themselve are already cached, right? So now it's like the Dog to > > Owner: cached id to object, no db hit. > > > > Hope that helps, > > Anne > > > > On Fri, Nov 13, 2009 at 3:14 PM, eigeneachse <[email protected] > >wrote: > > > > > > > > > h...@all, > > > i have read various posts, blogs.... about the nhibernate caching > > > methods. For me it is good that my SysCache2 configuration is working. > > > But it is only working in parts and i have a few problems in my > > > understanding if this is an configuration failure on my side or if > > > there is something other wrong. > > > > > So i have the following HQL Query > > > > > return Session.CreateQuery(@" > > > select something.....") > > > .SetParameter(0, aParameter) > > > .SetParameter(1, aSecondParameter) > > > .SetCacheable(true) > > > .SetCacheRegion("10Minutes") > > > .List<aClass>()[0]; > > > > > The returning class itself has some references to other tables which > > > are configured via an one-to-many relationship. When i call this query > > > then the first time the sql is fired against the database. So the base > > > objects and the referenced objects are fetched from the database. If i > > > do this a second time, then only the referenced objects are fetched > > > over sql again. But why? I think i have configured that everything > > > should be cached. > > > And here is where my understanding in nhibernate caching ends. Are > > > only the base objects cached? Why arent the referenced objects cached? > > > I read about the query cache and the entity cache. I think that here > > > the query cache is used. How can the referenced objects be cached? > > > > > It would be very good if someone could help my with this. I am really > > > optimistic that this problem is solved already. > > > Please let me know if you need more informations. > > > > > Thanks in advance for your help > > > > > Regards > > > > > eigeneachse > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
