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

Reply via email to