Hello, I have implemented persistent session management in my application (using cookies and session IDs in the database). Everything works fine, but sometimes I see Hibernate errors "Batch update returned unexpected row count from update" when committing database changes after setting up a new session.
It turns out that it happens when user starts a request and then quickly initiates reload of the same page. So I suppose this is a threading issue (one thread has already started creating session ID record, then user interrupts the connection and starts another request while the previous one hasn't been completed). I have implemented simple synchronization, but not yet sure if it's done correctly. So the question is: how do I synchronize method that creates the session? Currently it's implemented inside my authentication service: public void setupSessionForUser ( User user ) { synchronized ( this ) { user.clearSessions (); SessionToken newSessionToken = SessionToken.create (); user.addSessionToken ( newSessionToken ); hibernateSession.save ( newSessionToken ); asm.set ( User.class, (User) hibernateSession.merge ( user ) ); cookies.writeCookieValue ( "authcookiename", newSessionToken.toString () ); logger.info ( "set up new session {} for {}", newSessionToken.toString (), user.getEmail () ); } } Is that correct to synchronize on *this*? Or should I synchronize on HTTP Session instance instead? Thanks in advance. -- Ilya Obshadko