Re: Best practices for using Cayenne's ObjectContext in a web framework?

From: Florin T.PATRASCU (flo..ogers.com)
Date: Sun Sep 23 2007 - 14:38:11 EDT

  • Next message: Gary Jarrel: "Re: Temp ID issue - Exception"

    Hi Andrus,

    Thank you for reply. Following your advice and Malcolm's -the author
    of the CLICK web framework-, I (almost :) got a prototype working.

    I am configuring my module like this:

         <!--JPublish Cayenne support -->
         <module classname="org.jpublish.module.cayenne.JPCayenneModule">
             <cayenne-config-path>/WEB-INF/cayenne</cayenne-config-path>
             <auto-rollback>true</auto-rollback>
             <session-scope>false</session-scope>
             <shared-cache>true</shared-cache>
             <!--
              ~ Http request paths using a per-request or a per-session
    Cayenne ObjectContext (OC),
              ~ the read-only paths will be interpreted first and will
    use a global OC one defined
              ~ per web app instance.
              ~ -->
             <cayenne-enabled-urls>
                 <url path="/info/*" readonly="true"/>
                 <url path="/status/*" readonly="true"/>
                 <url path="/rss/*" readonly="true"/>
                 <url path="/users/*" readonly="false"/>
                 <url path="/companies/*"/> <!--readonly="false" by
    default, if not defined-->
             </cayenne-enabled-urls>

             <debug>true</debug>
         </module>

    , where the module executes Before and After Actions for a request
    following the request path rules above. Though I am not sure I have
    to do anything for the OC, after a request was executed?!

    And since I am not using a Filter nor an additional Servlet (so the
    user can control the Cayenne behavior from the JPublish configuration
    file only), I can disable/enable the use/creation of the HttpSession,
    and when the session is disabled an "OC per request" will be created,
    otherwise I'll use the HttpSession as some of the web frameworks I
    was looking at are already doing it.

    For the read-only requests I will use an "OC per app" as you
    recommended.

    Even though I am very new to Cayenne I can say already that I like
    Cayenne :)

    Many thanks for support,
    -florin

    On 23-Sep-07, at 13:41 , Andrus Adamchik wrote:

    >> I generally use a new DataContext per thread, with a Filter
    >> binding the DataContext to request thread.
    >
    > I think at some point we should update the docs for 3.0 with
    > information discussing 3 main patterns with all drawbacks and
    > benefits. Here is a short summary:
    >
    > * OC per request
    >
    > - no synchronization issues, smallest memory footprint
    > - some overhead in creating a new DataContext on every request
    > - no "local" caching (can be good or bad depending on the app)
    > - no uncommitted state is allowed between requests
    >
    > * OC per session:
    >
    > - Potential synchronization issues on update (if the same user
    > clicks too fast). Possible solution - nested DataContexts per
    > request working off of a single session context. Another solution
    > is synchronization of action methods.
    > - efficient local cache
    > - uncommitted state can be preserved between requests
    >
    > OC per app
    >
    > - applicable for read-only applications (no special
    > synchronization required in this case)
    > - very efficient local cache
    >
    > Andrus
    >
    >
    > On Sep 23, 2007, at 2:09 PM, Malcolm Edgar wrote:
    >> Hi Florin,
    >>
    >> I generally use a new DataContext per thread, with a Filter
    >> binding the DataContext to request thread. Please see the
    >> attached example.
    >>
    >> regards Malcolm Edgar
    >> http://click.sourceforge.net
    >>
    >> On 9/23/07, Florin T.PATRASCU <florin.patrasc..mail.com> wrote:
    >> Hi there,
    >>
    >> I am trying to add Cayenne support to the JPublish web framework
    >> ( http://code.google.com/p/jpublish/) and being very new to Cayenne I
    >> would like, if possible, to find which is the best practice for
    >> obtaining and using the OC?
    >>
    >> I browsed the threads here and most of the information I have show
    >> that one of the most common solution is to use the HttpSession.
    >> That's clear and I can do that very easy, but I wonder if there is a
    >> better way because I would like to use Cayenne for session-less
    >> requests as well. So, would it be prohibitive to create an OC for
    >> every HttpRequest? aka:
    >>
    >> ObjectContext oc = DataContext.createDataContext();
    >>
    >> If not, would this pattern affect the server stability (memory,
    >> handlers, threads, db pools, etc.)? What about having a global OC
    >> instance per application?
    >>
    >> Also, is it safe to start developing on top of the Cayenne 3.x
    >> version?
    >>
    >> Being my first post on this forum, I would like to thank Cayenne's
    >> creators for making it available and to you, the users, for the
    >> useful information accumulated in this forum during the time.
    >>
    >> Thank you,
    >> -florin
    >



    This archive was generated by hypermail 2.0.0 : Sun Sep 23 2007 - 14:38:47 EDT