Easy ORM-ness with Objectify-Appengine - Indicthreads cloud computing conference 2011


Published on

Session presented at the 2nd IndicThreads.com Conference on Cloud Computing held in Pune, India on 3-4 June 2011.


Abstract: There are many persistence frameworks on Google App Engine. Google has its low-level datastore API, then there are standards based frameworks like JPA and there are more frameworks like Objectify-Appengine specifically for Google App Engine. Managing persistence is still a challenge. With so many options, we face the dilemma of choosing right framework for the application we are building.

Objectify-Appengine extends the convenience of NoSql by providing a Hibernate-style mapping layer between your application and GAE datastore. In this session I will cover handling persistence on Google App Engine with Objectify-Appengine. At one hand Google datastore API is low level and at the other there are standard based frameworks like JPA/JDO. Objectify-Appengine tries to hit the sweet spot between the two.

Takeaways for the Audience
Audience will see the capabilities of Objectify-Appengine and how can they leverage it to manage persistence on Google App Engine. The best practises to be followed when using Objectify, and demo of an application built on Objectify-Appengine.

Speaker:Meetu Maltiar is a Senior Consultant at Inphina. In his six year experience he has worked as Software developer, Knowledge Manager and as a Mentor. He is passionate about technology and has experience in product development as well as services. He has experience on Google App Engine and has migrated existing applications to cloud and he has also worked on Green-field projects. He likes to invest his time in exploring upcoming languages like Scala and technology frameworks like GridGain, Esper and Hadoop and extensively blogs about them.

Published in: Technology, Business
  • Be the first to comment

  • Be the first to like this

Easy ORM-ness with Objectify-Appengine - Indicthreads cloud computing conference 2011

  1. 1. Easy ORM-ness with Objectify-Appengine Meetu Maltiar Inphina Technologies 1
  2. 2. Overall Presentation GoalGoogle Datastore BasicsOptions available for managing persistenceObjectify-AppengineDemo of an application using Objectify 2
  3. 3. Enough About MeSenior Software Engineer at InphinaTechnologies that interest me: Cloud Computing Scala Hadoop 3
  4. 4. Datastore BasicsEntitiesOperationsKeysTransactions 4
  5. 5. EntitiesAn Entity is an object’s worth of data in the datastoreIn datastore an Entity is like HashMap-like object of type EntityDatastore is conceptually a HashMap of keys to entities, and an Entity is conceptually a HashMap of name/value pairs 5
  6. 6. OperationsGet() an entity as a whole from datastorePut() an entity as whole in datastoreDelete() an entity from datastoreQuery() for entities matching criteria you define 6
  7. 7. KeysIn the datastore, entities are identified by the id (or name) and a kind, which corresponds to the type of Object you are storing.So, to get Employee #111 from datastore, we need to call something like get_from_datastore (“Employee”, 111) 7
  8. 8. Keys ContinuedThere is actually a third parameter required to identify an entity and it is called parentParent places the child in the same entity group as the parentParent (which can be null for the un-parented, root entity) is also required to uniquely identify an Entity. 8
  9. 9. Keys ContinuedSo, to get Employee #111 from datastore we need to call something equivalent to:get_from_datastore (“Employee”, 111, null)or,get_from_datastore (“Employee”, 111, the_parent).Instead of passing three parameters datastore wraps it in a single Object called Key. 9
  10. 10. TransactionsData gets stored in gigantic form of thousands of machinesIn order to perform an atomic transaction datastoreTo give us more that over where our data is same requires control entities lie on servers. stored, the datastore has a concept of an entity groupTo give us more control over where our data is stored, the datastore has a concept of an entity group 10
  11. 11. Transactions ContinuedWithin a Transaction we can access data from a single entity groupChoose entity groups carefullyWhy not have everything in a single entity group?Google restricts number of requests per second per entity group 11
  12. 12. Executing TransactionsWhen we execute get(), put(), delete() or query() in transactionWe must operate it on single entity groupAll operations will either fail or succeed completelyIf another process modifies the data before commit datastore operation will fail 12
  13. 13. Tools 13
  14. 14. Persistence OptionsJPA/JDOGoogle DatastorePersistence Frameworks on GAE Objectify-Appengine Twig Simple Datastore Slim3 14
  15. 15. Google Datastore ChallengesSupports just four operationsIt persists GAE-Specific entity classes rather than POJO’sDatastore Keys are untyped 15
  16. 16. JPA/JDO ChallengesExtra Cruft Fetch Groups Detaching Owned/Unowned relationshipsLeaky Abstraction Keys Entity Groups Indexes 16
  17. 17. Developers Dilemma 17
  18. 18. ObjectifyIt lets you persist, retrieve, delete and query typed objectsAll native datastore features are supportedIt provides type safe key and query classes 18
  19. 19. Objectify Design ConsiderationsMinimally impacts cold start time. It is light weightNo external dependencies apart from GAE SDK 19
  20. 20. Working With DatastoreEntity ent = new Entity(“car”);ent.setProperty(“color”, “red”);ent.setProperty(“doors”, 2);service.put(ent); 20
  21. 21. Objectify ORMNess Objects!Employee emp = new Employee();emp.setFirstName(“John”);emp.setLastName(“Smith”);service.put(emp); 21
  22. 22. An Objectify Entitypublic class Employee { @Id Long id; private String firstName; private String lastName;} 22
  23. 23. get() OperationObjectify ofy = Objectifyservice.begin();Employee emp = ofy.get(Employee.class, 123);Map<Long, Employee> employees = ofy.get(Employee.class, 123, 124, 125); 23
  24. 24. put() OperationObjectify ofy = Objectifyservice.begin();Employee emp = new Employee(“John”, “adams”);ofy.put(emp);System.out.println(“Id Generated is ” + emp.getId());List<Employee> employees = createEmployees();ofy.put(employees); 24
  25. 25. delete() OperationObjectify ofy = Objectifyservice.begin();ofy.delete(Employee.class, 123);Employee emp = // get Employee from some whereofy.delete(emp); 25
  26. 26. query() OperationObjectify ofy = Objectifyservice.begin();List<Employee> employees = ofy.query(Employee.class).filter(“firstName =”, “John”) 26
  27. 27. Demo get() put() delete() query() 27
  28. 28. Objectify Best PracticesUse a DAO to register entitiesAutomatic Scanning not advised adds to initialization time will require dependency jars apart from GAE will require changes in web.xmlGAE spins down the instance when not in use. When it comes up the request is slow because of added initialization time. This is called cold start. 28
  29. 29. Objectify Best Practices …Use Batch Gets Instead of QueriesUse Indexes sparinglyBy default every field of object will be indexed. It comes with heavy computational price.Use @Unindexed on entity level and @Indexed at fields required for queryAvoid @ParentIn JPA “owned” entity relationship provides referential integrity checking and cascading deletes and saves. Not so here. 29
  30. 30. Happy Developer 30
  31. 31. ConclusionJDO/JPA learning curve is steep due to App Engine’s non- relational nature and unique concepts such as entity groups, owned and un-owned relationships.Google Datastore is low level. It makes no pretense of being relational but also does not allow working with objects. It just stores the objects of type com.google.appengine.api.datastore.EntityObjectify is light weight and it preserves the simplicity and transparency of low level API and does all work converting to and from POJOS to Entity Objects. 31
  32. 32. mmaltiar@inphina.com www.inphina.comhttp://thoughts.inphina.com 32
  33. 33. ReferencesObjectify-Appengine http://code.google.com/p/objectify-appengine/Google IO 2011 Session on highly productive gwt rapid development with app-engine objectify-requestfactory and gwt-platformTwitter mining with Objectify-Appengine http://www.ibm.com/developerworks/java/library/j-javadev2-14 - 33