java - Google App Engine Datastore too slow persistence -


i'm developing gae/j app using jdo manage datastore. offers number of endpoints interact data , on. i'm developing javascript client endpoints.

situation:

first have endpoint method token getsessiontoken(user usr), generates session token, assigns user , stores both user , session token in datastore.

then have endpoint method info getinfo(token token) receives session token, checks if session token corresponds user , if so, returns info.

problem

from javascript client, call first method , fine. call second method retreved session token, , receive error saying session token doesn't correspond user...

i've checked , realised error happens because new session token has not been persisted yet!

question

my current solution make javascript client call second method once, , if receives error, wait while , call again... there better solution?


edit:

this code invloved in first method call idea why takes long...

endpoint:

@apimethod(     name = "getsessiontoken",     path = "get_session_token",     httpmethod = httpmethod.get ) public sessiontoken getsessiontoken (@named("email") string email, @named("password") string password)          throws internalservererrorexception {            sessiontoken sessiontoken = new userscontroller().getsessiontoken(email, password);     return sessiontoken; } 

control:

public sessiontoken getsessiontoken(string email, string password) throws internalservererrorexception {             sessiontoken sessiontoken = null;      persistencemanager pm = pmf.get().getpersistencemanager();           transaction txn = datastoreservicefactory.getdatastoreservice().begintransaction();     try {         dao dao = new dao(pm);          user user = dao.getuserbylogin(email, password);          dao.deletesessiontoken(user.getsessiontoken());         sessiontoken = sessiontokenmanager.generatetoken(user.getemail(), user.getpassword());         user.setsessiontoken(sessiontoken);          user = dao.insertuser(user);              txn.commit();         } catch (exception e) {         throw new internalservererrorexception();     } {         if (txn.isactive()) {             txn.rollback();         }         pm.close();     }            return sessiontoken; } 

dao:

public user getuserbylogin(string email, string password) throws internalservererrorexception {     user user = null;     query query = null;     try {         query = this.pm.newquery(user.class);         query.setfilter("email == emailparam && password == passwordparam");         query.declareparameters("string emailparam, string passwordparam");              list<user> results = (list<user>) query.execute(email, password);         user = results.get(0);     } catch (exception e) {         e.printstacktrace();         throw new internalservererrorexception("error in dao.getuserbylogin()");     } {         query.closeall();     }     return user; }  /////  public void deletesessiontoken(sessiontoken sessiontoken) throws internalservererrorexception {     try {         this.pm.deletepersistent(sessiontoken);     } catch (exception e) {         e.printstacktrace();         throw new internalservererrorexception("error in dao.deletesessiontoken()");     } }  /////  public user insertuser(user user) throws internalservererrorexception {          try {         this.pm.makepersistent(user);     } catch (exception e) {         e.printstacktrace();         throw new internalservererrorexception("error in dao.insertuser()", e);     }                     return user; } 

model:

@persistencecapable public class user {      @primarykey     @persistent(valuestrategy = idgeneratorstrategy.identity)     private key key;         @persistent     private string name;     @persistent     private string email;     @persistent     private string password;         @persistent     private folder rootfolder;       @persistent     private sessiontoken sessiontoken;       @persistent(defaultfetchgroup = "true")     private accountcontainer accountcontainer;     //getters & setters }  /////  @persistencecapable public class sessiontoken {              @primarykey     @persistent(valuestrategy = idgeneratorstrategy.identity)     private key key;     @persistent     private string token;     @persistent     private long created;     @persistent     private string sha1;     //getters & setters } 

maybe 1 of following possible , suits needs

  • can combine 2 calls "getsessiontokenandinfo" call? return token , info together. depending how code works maybe token , user objects available , dont need loaded then?

  • use form of caching first endpoint leaves in memcache need try retreive datastore in second call removed (at least in cases memcache should reliable enough such scenario).


Comments

Popular posts from this blog

java - Jmockit String final length method mocking Issue -

asp.net - Razor Page Hosted on IIS 6 Fails Every Morning -

c++ - wxwidget compiling on windows command prompt -