killbill-memoizeit

util: optimize session update query This is an attempt to

5/27/2015 5:54:12 AM

Details

diff --git a/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionDao.java b/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionDao.java
index 9e6df64..0b0188b 100644
--- a/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionDao.java
+++ b/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionDao.java
@@ -25,6 +25,8 @@ import javax.inject.Inject;
 
 import org.apache.shiro.session.Session;
 import org.apache.shiro.session.mgt.eis.CachingSessionDAO;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 import org.skife.jdbi.v2.IDBI;
 import org.skife.jdbi.v2.Transaction;
 import org.skife.jdbi.v2.TransactionStatus;
@@ -44,7 +46,10 @@ public class JDBCSessionDao extends CachingSessionDAO {
 
     @Override
     protected void doUpdate(final Session session) {
-        jdbcSessionSqlDao.update(new SessionModelDao(session));
+        // Assume only the last access time attribute was updated (see https://github.com/killbill/killbill/issues/326)
+        final DateTime lastAccessTime = new DateTime(session.getLastAccessTime(), DateTimeZone.UTC);
+        final Long sessionId = Long.valueOf(session.getId().toString());
+        jdbcSessionSqlDao.updateLastAccessTime(lastAccessTime, sessionId);
     }
 
     @Override
diff --git a/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionSqlDao.java b/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionSqlDao.java
index 676d082..ea99854 100644
--- a/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionSqlDao.java
+++ b/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionSqlDao.java
@@ -16,6 +16,7 @@
 
 package org.killbill.billing.util.security.shiro.dao;
 
+import org.joda.time.DateTime;
 import org.killbill.commons.jdbi.binder.SmartBindBean;
 import org.skife.jdbi.v2.sqlobject.Bind;
 import org.skife.jdbi.v2.sqlobject.SqlQuery;
@@ -36,6 +37,9 @@ public interface JDBCSessionSqlDao extends Transactional<JDBCSessionSqlDao> {
     public void update(@SmartBindBean final SessionModelDao sessionModelDao);
 
     @SqlUpdate
+    public void updateLastAccessTime(@Bind("lastAccessTime") final DateTime lastAccessTime, @Bind("recordId") final Long sessionId);
+
+    @SqlUpdate
     public void delete(@SmartBindBean final SessionModelDao sessionModelDao);
 
     @SqlQuery
diff --git a/util/src/main/resources/org/killbill/billing/util/security/shiro/dao/JDBCSessionSqlDao.sql.stg b/util/src/main/resources/org/killbill/billing/util/security/shiro/dao/JDBCSessionSqlDao.sql.stg
index fe228d2..2599c29 100644
--- a/util/src/main/resources/org/killbill/billing/util/security/shiro/dao/JDBCSessionSqlDao.sql.stg
+++ b/util/src/main/resources/org/killbill/billing/util/security/shiro/dao/JDBCSessionSqlDao.sql.stg
@@ -40,6 +40,13 @@ where record_id = :recordId
 ;
 >>
 
+updateLastAccessTime() ::= <<
+update sessions set
+  last_access_time = :lastAccessTime
+where record_id = :recordId
+;
+>>
+
 delete() ::= <<
 delete from sessions
 where record_id = :recordId
diff --git a/util/src/test/java/org/killbill/billing/util/security/shiro/dao/TestJDBCSessionDao.java b/util/src/test/java/org/killbill/billing/util/security/shiro/dao/TestJDBCSessionDao.java
index c8da341..df97ca8 100644
--- a/util/src/test/java/org/killbill/billing/util/security/shiro/dao/TestJDBCSessionDao.java
+++ b/util/src/test/java/org/killbill/billing/util/security/shiro/dao/TestJDBCSessionDao.java
@@ -22,6 +22,7 @@ import java.util.UUID;
 
 import org.apache.shiro.session.Session;
 import org.apache.shiro.session.mgt.SimpleSession;
+import org.joda.time.DateTime;
 import org.killbill.billing.util.UtilTestSuiteWithEmbeddedDB;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -56,11 +57,11 @@ public class TestJDBCSessionDao extends UtilTestSuiteWithEmbeddedDB {
         Assert.assertEquals(retrievedSession, session);
 
         // Update
-        final String newHost = UUID.randomUUID().toString();
-        Assert.assertNotEquals(retrievedSession.getHost(), newHost);
-        session.setHost(newHost);
+        final Date lastAccessTime = DateTime.now().withTimeAtStartOfDay().toDate(); // Milliseconds will be truncated
+        Assert.assertNotEquals(retrievedSession.getLastAccessTime(), lastAccessTime);
+        session.setLastAccessTime(lastAccessTime);
         jdbcSessionDao.doUpdate(session);
-        Assert.assertEquals(jdbcSessionDao.doReadSession(sessionId).getHost(), newHost);
+        Assert.assertEquals(jdbcSessionDao.doReadSession(sessionId).getLastAccessTime().compareTo(lastAccessTime), 0);
 
         // Delete
         jdbcSessionDao.doDelete(session);