Hi Andrus,
thanks for the reply. Isn't creating a new context per request very
ineffective (see
http://cayenne.apache.org/doc/obtaining-datacontext.html)? Cayenne 3.0M5
is the version from SVN (or a nightly build), right? I will try this
one, thanks again.
Krzysztof
Andrus Adamchik schrieb:
> Hi Krzysztof,
>
> You can switch to Cayenne 3.0M5. It uses weak references and will
> prevent objects in the ObjectStore from accumulating. Or throw away
> the context at the end of the request or after N requests.
>
> Andrus
>
> On Aug 27, 2008, at 2:23 PM, Krzysztof Janowicz wrote:
>
>> Hi,
>>
>> I am playing around with GWT, trying to implement a stateful client with
>> a stateless server (IMO this is the paradigm shift proposed by the
>> google guys). While this is a very promising solution for massive Web
>> 2.0 ajax applications, I am running into some trouble handling this with
>> cayenne (2.0.4).
>>
>> Most of the application logic is handled by the GWT client. The servlet
>> (GWT RPCService) is only used if the users change their settings or have
>> to interact with each other. As there will be many users I don't want to
>> have a session and associated datacontext per user. This would be very
>> ineffective, since communication between client and server is reduced to
>> a minimum. In addition, the datacontext stores objects in the
>> objectstore to manage their states, this is not necessary in a stateless
>> server scenario. Moreover, there are several isolated RPC services the
>> users are interacting with.
>>
>> Hence, I decided to bind the context to a thread (see
>> http://cayenne.apache.org/doc20/obtaining-datacontext.html). Each
>> servlet handles a couple of threads automatically (in my case tomcat)
>> and each thread has an own datacontext. This seems to be a nice solution
>> as I don't face and tread-safety problems and don't need to care about
>> sessions.
>>
>> The first thing when executing a method within a RPCService is to call a
>> getcontext() method which gets the datacontext bounded to the thread
>> (DataContext.getThreadDataContext()) or creates one
>> (DataContext.bindThreadDataContext(DataContext.createDataContext(false)))
>>
>> if this is the first time this thread is executed by the servlet
>> container. My only concern so far is the objectstore of the datacontext
>> which keeps collecting objects. I set cayenne.DataRowStore.snapshot.size
>> to 1 but this only affects the DataRowStore. I tried to use
>> context.getObjectStore().startTrackingNewObjects() and then
>> context.getObjectStore().unregisterNewObjects() every time i get the
>> context from the thread but this does not solve my problem. IMO i don't
>> need to track any objects in the objectStore. If a client calls a
>> RPCService to create/change/delete something, this is either directly
>> commited to the DB (context.commitChanges()) or rolled back in case of
>> an error (context.rollbackChanges()). As the datacontext is kept per
>> thread its objectstore will run full of data which will probably be
>> never used again. Is there a way to clear the objectstore (expect
>> calling unregisterNode() for each created object by hand)? Should I
>> create a new datacontext for a thread after a while?
>>
>> Any ideas? Thanks in advance.
>> Krzysztof
>>
>
>
>
This archive was generated by hypermail 2.0.0 : Wed Aug 27 2008 - 08:43:44 EDT