You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Krzysztof Janowicz <k...@janowicz.de> on 2008/08/27 13:23:57 UTC

Stateless server (GWT)

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

Re: Stateless server (GWT)

Posted by Andrus Adamchik <an...@objectstyle.org>.
Sorry, I meant 3.0M4.

When getting a new DataContext on every request, you bypass one level  
of caching, but in your situation this may actually be what you want.

Andrus


On Aug 27, 2008, at 3:43 PM, Krzysztof Janowicz wrote:

> 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
>>>
>>
>>
>>
>
>


Re: Stateless server (GWT)

Posted by Krzysztof Janowicz <k...@janowicz.de>.
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
>>
>
>
>


Re: Stateless server (GWT)

Posted by Andrus Adamchik <an...@objectstyle.org>.
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
>