Hi Vince Thanks for sharing. I've modified my persistence framework to incorporate your class and it works very well.
kind regards Roy On Mon, Nov 2, 2009 at 8:15 PM, Vince Bonfanti <vbonfa...@gmail.com> wrote: > > P.S. Because of issue 2097 > (http://code.google.com/p/googleappengine/issues/detail?id=2097), the > write-behind task doesn't work on the development server, so it always > defaults to write-through (which is a nice test of the watchdog > mechanism). The write-behind task works fine on the production > servers. > > On Mon, Nov 2, 2009 at 3:12 PM, Vince Bonfanti <vbonfa...@gmail.com> > wrote: > > You might be interested in my CachingDatastoreService class: > > > > > http://code.google.com/p/gaevfs/source/browse/trunk/src/com/newatlanta/appengine/datastore/CachingDatastoreService.java > > > > It has the following features: > > > > - Implements the com.google.appengine.api.datastore.DatastoreService, > > so it's a plug-in replacement for the standard implementation. > > - Automatically caches entities in memcache for datastore reads and > writes. > > - Has a write-behind option (the default) that queues all datastore > > writes as background tasks (except for transactions, which are always > > write-through directly to the datastore). > > - A watchdog task makes sure the write-behind task is always available. > > - If the write-behind task isn't available, defaults to write-through > > to insure no loss of data. > > - Supports configurable expiration of memcache entities (the default > > is no expiration). > > > > In order to use the CachingDatastoreService, first configure the > > write-behind task in web.xml: > > > > <servlet> > > <servlet-name>CachingDatastoreService</servlet-name> > > > > <servlet-class>com.newatlanta.appengine.datastore.CachingDatastoreService</servlet-class> > > </servlet> > > <servlet-mapping> > > <servlet-name>CachingDatastoreService</servlet-name> > > <url-pattern>/_ah/queue/write-behind-task</url-pattern> > > </servlet-mapping> > > > > Then configure the write-behind-task queue in queue.xml (use whatever > > rate you want): > > > > <queue> > > <name>write-behind-task</name> > > <rate>5/s</rate> > > </queue> > > > > Then replace the following code: > > > > DatastoreService ds = DatastoreServiceFactory().getDatastoreService(); > > > > with this code, and then use the DatastoreService methods as you normally > would: > > > > DatastoreService ds = new CachingDatastoreService(); > > > > The default CachingDatastoreService constructor enables the > > CacheOptions.WRITE_BEHIND option and sets the expiration to "null" (no > > expiration). There are additional constructors that allow you to > > specify CacheOptions.WRITE_THROUGH and/or specify a memcache > > expiration value. > > > > Vince > > > > On Mon, Nov 2, 2009 at 2:21 PM, Stakka <henrik.lindqv...@gmail.com> > wrote: > >> > >> One feature I see useful for a layer atop the Low-Level API is > >> asynchronization. Since you'll never know how much time a Low-Level > >> API call will take it should automatically create Tasks for them, > >> writes atleast. > >> > >> > >> On Oct 22, 10:37 am, Nacho Coloma <icol...@gmail.com> wrote: > >>> Hi all, > >>> > >>> We have been developing a persistence framework for the AppEngine > >>> Datastore based on the raw DatastoreService API. For our (simple) > >>> persistence case, both JDO and JPA were a bit overkill as we were > >>> spending a significant amount of time jumping through hoops to make > >>> our application roll, but at the same time the Datastore API was a too > >>> low-level solution to be usable. > >>> > >>> So we reinvented our wheel. In two days. > >>> > >>> SimpleDS is a light wrapper around the DatastoreService APIs that > >>> provide a simple interface for java persistent classes. It does not > >>> include fancy stuff or any super features, it's just the > >>> DatastoreService ported to a world where Java entities can be > >>> persisted directly (using a subset of JPA annotations). This is _not_ > >>> a JPA/JDO replacement, and will never be. But we have been using it > >>> for some weeks and are quite happy with it. > >>> > >>> Any kind of feedback from the AppEngine community would be welcome. > >>> Before calling the typical "but we already have JPA/JDO!" argument, > >>> please notice the following: > >>> > >>> * There are lots of considerations in a relational database that do > >>> not apply to AppEngine. This allows a specific solution to be > >>> simplified big time. Just see the depth of your typical stack trace to > >>> understand what I am talking about. > >>> * Solutions can be designed for specific cases that are common > >>> practice in AppEngine but do not apply to a relational database. See, > >>> for example, saving entities with a parent instance. > >>> * Transactions also behave a bit differently, where a "one size fits > >>> all" approach would probably not be the best solution. > >>> > >>> To better ilustrate with an example, these are some typical tasks > >>> performed with SimpleDS: > >>> > >>> Retrieve instance: > >>> FooBar bar = entityManager.get(key); > >>> > >>> Transform from Google Datastore Entity to java and viceversa: > >>> Entity entity = entityManager.datastoreToJava(bar); > >>> > >>> Save generating a primary key, with a parent instance: > >>> FooBar bar = new FooBar(); > >>> entityManager.put(parentKey, bar); > >>> > >>> More can be seen here: > http://code.google.com/p/simpleds/wiki/SimpleTasks > >>> > >>> Any discussion about the current API state is welcome. This entire > >>> thing was rolled in two days and tested in a couple of weeks so there > >>> should be some bugs in between. > >>> > >>> It is important to keep in mind the current list of limitations: > >>> > >>> * Only the Key class is a supported primary key. > >>> * IN and != are not supported (yet). I have big concerns about > >>> supporting this, performance-wise. > >>> * Relationships are not supported. You can use Keys and collections of > >>> Keys for that purpose. > >>> * Transactions are not yet included. We are not yet sure about how to > >>> proceed here. > >>> > >>> As I said, this is not conceived to become a feature-complete JPA > >>> replacement, so please don't treat it like that. > >>> > >>> Best regards, > >>> > >>> Nacho. > >> >> > >> > > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~----------~----~----~----~------~----~------~--~---