diff --git a/src/main/java/de/thm/arsnova/config/ExtraConfig.java b/src/main/java/de/thm/arsnova/config/ExtraConfig.java index 922b7f3f27b71efb4dd8beabc09625af9f5ec9ea..0e6ba84af71b0f683501b2501b4f14608f9abc3c 100644 --- a/src/main/java/de/thm/arsnova/config/ExtraConfig.java +++ b/src/main/java/de/thm/arsnova/config/ExtraConfig.java @@ -19,6 +19,9 @@ package de.thm.arsnova.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.concurrent.ConcurrentMapCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @@ -33,6 +36,7 @@ import de.thm.arsnova.connector.client.ConnectorClientImpl; import de.thm.arsnova.socket.ARSnovaSocketIOServer; @Configuration +@EnableCaching public class ExtraConfig { @Autowired @@ -98,4 +102,9 @@ public class ExtraConfig { socketServer.setStorepass(socketStorepass); return socketServer; } + + @Bean + public CacheManager cacheManager() { + return new ConcurrentMapCacheManager(); + } } diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 24121046e53b417478f18a03e7b1884127516cd9..00028f5bae02abf605ae28d2e7c06088ec51496e 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -39,6 +39,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; @@ -353,6 +356,7 @@ public class CouchDBDao implements IDatabaseDao { } @Override + @Cacheable("sessions") public final Session getSessionFromKeyword(final String keyword) { final NovaView view = new NovaView("session/by_keyword"); view.setKey(keyword); @@ -368,6 +372,7 @@ public class CouchDBDao implements IDatabaseDao { } @Override + @Cacheable("sessions") public final Session getSessionFromId(final String sessionId) { final NovaView view = new NovaView("session/by_id"); view.setKey(sessionId); @@ -410,6 +415,7 @@ public class CouchDBDao implements IDatabaseDao { } catch (final IOException e) { return null; } + // session caching is done by loading the created session return getSession(sessionDocument.getString("keyword")); } @@ -667,19 +673,21 @@ public class CouchDBDao implements IDatabaseDao { } @Override - public final void updateSessionOwnerActivity(final Session session) { + @CachePut(value = "sessions") + public final Session updateSessionOwnerActivity(final Session session) { try { /* Do not clutter CouchDB. Only update once every 3 hours. */ if (session.getLastOwnerActivity() > System.currentTimeMillis() - 3 * 3600000) { - return; + return session; } session.setLastOwnerActivity(System.currentTimeMillis()); final JSONObject json = JSONObject.fromObject(session); getDatabase().saveDocument(new Document(json)); + return session; } catch (final IOException e) { LOGGER.error("Failed to update lastOwnerActivity for Session {}", session); - return; + return session; } } @@ -1275,6 +1283,7 @@ public class CouchDBDao implements IDatabaseDao { } @Override + @CachePut(value = "sessions") public Session updateSession(final Session session) { try { final Document s = database.getDocument(session.get_id()); @@ -1293,6 +1302,7 @@ public class CouchDBDao implements IDatabaseDao { } @Override + @CacheEvict(value = "sessions") public void deleteSession(final Session session) { try { deleteDocument(session.get_id()); diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index 8d9b1974bcf50168a1b195b23ef4c5e502508e18..09146dc25b8de2dbb20db8738ab446a58be41c03 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -60,7 +60,7 @@ public interface IDatabaseDao { LoggedIn registerAsOnlineUser(User u, Session s); - void updateSessionOwnerActivity(Session session); + Session updateSessionOwnerActivity(Session session); List<String> getQuestionIds(Session session, User user); diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 51b41580f2b9e246d842259c1a091e3927995223..6ab182634c5553f6cf6e1380bf7822135dfea483 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -225,9 +225,9 @@ public class StubDatabaseDao implements IDatabaseDao { } @Override - public void updateSessionOwnerActivity(Session session) { + public Session updateSessionOwnerActivity(Session session) { // TODO Auto-generated method stub - + return null; } @Override