Thanks Mike and Michael! As usual, you are very kind. So, there are a lot of "strategy" using datacontext, but the singleton is the bad one :-) The write operation i perfrom in my site is very simple. It's just an insert of two fields in a single table. So maybe also singleton should work, but i'm agree with you.. in this way any commit or rollback operations are out of control if i don't "connect" them almost with a user session.
Thanks again! Davide On Sat, May 22, 2010 at 2:09 PM, Mike Kienenberger <mkien...@gmail.com>wrote: > Note that just because there are multiple data contexts doesn't mean > you can't share the object cache. By default, they are shared across > the application. A data context is typically a subset of your total > fetched objects -- those which are you are making specific changes to > as a group. > > http://cayenne.apache.org/doc30/caching-and-fresh-data.html > http://cayenne.apache.org/doc30/individual-object-caching.html > > Also, using a per-session datacontext isn't the "right way". It's > just one of many ways. I've used per-request data contexts, and even > per-method data contexts. It mostly depends on the length of the > scope of your database operations -- when you start modifying the data > and when you commit it. You'll want your data context to live for > however long that length of time is. > > On Sat, May 22, 2010 at 7:50 AM, Michael Gentry <mgen...@masslight.net> > wrote: > > Hi Davide, > > > > 1) Unless your application is read-mostly, and it doesn't sound like it > is, > > you'll want separate DataContexts per user to track their individual > changes > > in distinct DataContexts. Otherwise the changes will get co-mingled and > > chaos likely will ensue. > > > > 2) You should be fine, but you can always fine-tune later if required by > > kicking objects out of the DataContext yourself where it makes sense. I'd > > optimize this later, though, as it may not be needed. > > > > mrg > > > > > > On May 22, 2010, at 5:03 AM, "mr.abanjo" <mr.aba...@gmail.com> wrote: > > > >> Hi, > >> I'm developing a simple web application that store in a table an user > >> preference. > >> When a new user comes, i save a new record to a database using > >> datacontext: > >> * > >> * > >> > >> *datacontext.registerNewObject< > http://cayenne.apache.org/doc30/api/org/apache/cayenne/access/DataContext.html#registerNewObject(java.lang.Object) > > > >> > >> *(Object< > http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html?is-external=true > > > >> myobject); > >> > >> *datacontext.**commitChanges< > http://cayenne.apache.org/doc30/api/org/apache/cayenne/access/DataContext.html#commitChanges() > > > >> *(); > >> > >> Cayenne perform an insert and all works fine. > >> I have 2 questions: > >> > >> 1) Reading the documentation the right way in a web application to > create > >> a > >> datacontext is per session: > >> http://cayenne.apache.org/doc30/obtaining-datacontext.html > >> What happens if i treat it as a singleton? ( So i have one instance for > >> all > >> the users ) > >> > >> 2) My web application has a high traffic, so i think that in a few time > >> i've > >> "registered" in datacontext thousands of record. This objects are > >> correctly > >> garbage collected or they stay in memory? > >> Reading the documentation: > >> > >> Since Cayenne 3.0, by default DataContext uses weak references to store > >> registered objects. So objects are allowed to be garbage collected by > the > >> VM > >> if they are not referenced elsewhere in the application. "Elsewhere" > >> usually > >> means one of the following: > >> > >> - An object is directly or indirectly referenced by the application. > [*NO > >> reference to them by any object in my application]* > >> - An object is a part of the cached query result stored by Cayenne. [*I > >> never configured cayenne for cache.. so if i'm not wrong, the default > is > >> NO-CACHE]* > >> - An object is "dirty" (i.e. new, modified or deleted). In this case > >> Cayenne ensures that such object is retained at least until commit or > >> rollback. [*I perform always a commit after registering a new object]* > >> > >> So... i think that the memory should be correctly freed. > >> > >> N.B. I'm using Cayenne 3.0! > >> > >> Thanks for help! > >> Davide > > >