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);