From f83a7a2ef7a0998cc2fcecc446dc0cea67d967db Mon Sep 17 00:00:00 2001 From: Athou Date: Mon, 11 Aug 2014 06:11:12 +0200 Subject: [PATCH] better transaction granularity --- .../com/commafeed/CommaFeedApplication.java | 8 +- .../service/DatabaseCleaningService.java | 78 ++++++++++--------- .../backend/task/OldStatusesCleanupTask.java | 18 +---- .../backend/task/OrphansCleanupTask.java | 16 +--- 4 files changed, 54 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/commafeed/CommaFeedApplication.java b/src/main/java/com/commafeed/CommaFeedApplication.java index 5c852ab5..35beaa05 100644 --- a/src/main/java/com/commafeed/CommaFeedApplication.java +++ b/src/main/java/com/commafeed/CommaFeedApplication.java @@ -142,8 +142,8 @@ public class CommaFeedApplication extends Application { // Services ApplicationPropertiesService applicationPropertiesService = new ApplicationPropertiesService(); - DatabaseCleaningService cleaningService = new DatabaseCleaningService(feedDAO, feedEntryDAO, feedEntryContentDAO, - feedEntryStatusDAO, feedSubscriptionDAO); + DatabaseCleaningService cleaningService = new DatabaseCleaningService(sessionFactory, feedDAO, feedEntryDAO, feedEntryContentDAO, + feedEntryStatusDAO); FeedEntryContentService feedEntryContentService = new FeedEntryContentService(feedEntryContentDAO); FeedEntryService feedEntryService = new FeedEntryService(feedSubscriptionDAO, feedEntryDAO, feedEntryStatusDAO, cacheService); FeedEntryTagService feedEntryTagService = new FeedEntryTagService(feedEntryDAO, feedEntryTagDAO); @@ -202,8 +202,8 @@ public class CommaFeedApplication extends Application { // Tasks SchedulingService schedulingService = new SchedulingService(); - schedulingService.register(new OldStatusesCleanupTask(sessionFactory, config, cleaningService)); - schedulingService.register(new OrphansCleanupTask(sessionFactory, cleaningService)); + schedulingService.register(new OldStatusesCleanupTask(config, cleaningService)); + schedulingService.register(new OrphansCleanupTask(cleaningService)); // Managed objects environment.lifecycle().manage(startupService); diff --git a/src/main/java/com/commafeed/backend/service/DatabaseCleaningService.java b/src/main/java/com/commafeed/backend/service/DatabaseCleaningService.java index 49cf21f2..abd2d2bd 100644 --- a/src/main/java/com/commafeed/backend/service/DatabaseCleaningService.java +++ b/src/main/java/com/commafeed/backend/service/DatabaseCleaningService.java @@ -1,7 +1,6 @@ package com.commafeed.backend.service; import java.util.Calendar; -import java.util.Collections; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; @@ -9,15 +8,16 @@ import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.hibernate.SessionFactory; + import com.commafeed.backend.dao.FeedDAO; import com.commafeed.backend.dao.FeedEntryContentDAO; import com.commafeed.backend.dao.FeedEntryDAO; import com.commafeed.backend.dao.FeedEntryStatusDAO; -import com.commafeed.backend.dao.FeedSubscriptionDAO; +import com.commafeed.backend.dao.UnitOfWork; import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedEntryStatus; -import com.commafeed.backend.model.FeedSubscription; /** * Contains utility methods for cleaning the database @@ -29,19 +29,24 @@ public class DatabaseCleaningService { private static final int BATCH_SIZE = 100; + private final SessionFactory sessionFactory; private final FeedDAO feedDAO; private final FeedEntryDAO feedEntryDAO; private final FeedEntryContentDAO feedEntryContentDAO; private final FeedEntryStatusDAO feedEntryStatusDAO; - private final FeedSubscriptionDAO feedSubscriptionDAO; public long cleanEntriesWithoutSubscriptions() { log.info("cleaning entries without subscriptions"); long total = 0; int deleted = 0; do { - List entries = feedEntryDAO.findWithoutSubscriptions(BATCH_SIZE); - deleted = feedEntryDAO.delete(entries); + deleted = new UnitOfWork(sessionFactory) { + @Override + protected Integer runInSession() throws Exception { + List entries = feedEntryDAO.findWithoutSubscriptions(BATCH_SIZE); + return feedEntryDAO.delete(entries); + } + }.run(); total += deleted; log.info("removed {} entries without subscriptions", total); } while (deleted != 0); @@ -54,8 +59,13 @@ public class DatabaseCleaningService { long total = 0; int deleted = 0; do { - List feeds = feedDAO.findWithoutSubscriptions(BATCH_SIZE); - deleted = feedDAO.delete(feeds); + deleted = new UnitOfWork(sessionFactory) { + @Override + protected Integer runInSession() throws Exception { + List feeds = feedDAO.findWithoutSubscriptions(BATCH_SIZE); + return feedDAO.delete(feeds); + }; + }.run(); total += deleted; log.info("removed {} feeds without subscriptions", total); } while (deleted != 0); @@ -68,7 +78,12 @@ public class DatabaseCleaningService { long total = 0; int deleted = 0; do { - deleted = feedEntryContentDAO.deleteWithoutEntries(BATCH_SIZE); + deleted = new UnitOfWork(sessionFactory) { + @Override + protected Integer runInSession() throws Exception { + return feedEntryContentDAO.deleteWithoutEntries(BATCH_SIZE); + } + }.run(); total += deleted; log.info("removed {} contents without entries", total); } while (deleted != 0); @@ -77,13 +92,18 @@ public class DatabaseCleaningService { } public long cleanEntriesOlderThan(long value, TimeUnit unit) { - Calendar cal = Calendar.getInstance(); + final Calendar cal = Calendar.getInstance(); cal.add(Calendar.MINUTE, -1 * (int) unit.toMinutes(value)); long total = 0; int deleted = 0; do { - deleted = feedEntryDAO.delete(cal.getTime(), BATCH_SIZE); + deleted = new UnitOfWork(sessionFactory) { + @Override + protected Integer runInSession() throws Exception { + return feedEntryDAO.delete(cal.getTime(), BATCH_SIZE); + } + }.run(); total += deleted; log.info("removed {} entries", total); } while (deleted != 0); @@ -91,33 +111,21 @@ public class DatabaseCleaningService { return total; } - public void mergeFeeds(Feed into, List feeds) { - for (Feed feed : feeds) { - if (into.getId().equals(feed.getId())) { - continue; - } - List subs = feedSubscriptionDAO.findByFeed(feed); - for (FeedSubscription sub : subs) { - sub.setFeed(into); - } - feedSubscriptionDAO.saveOrUpdate(subs); - feedDAO.delete(feed); - } - feedDAO.saveOrUpdate(into); - } - - public long cleanStatusesOlderThan(Date olderThan) { + public long cleanStatusesOlderThan(final Date olderThan) { log.info("cleaning old read statuses"); long total = 0; - List list = Collections.emptyList(); + int deleted = 0; do { - list = feedEntryStatusDAO.getOldStatuses(olderThan, BATCH_SIZE); - if (!list.isEmpty()) { - feedEntryStatusDAO.delete(list); - total += list.size(); - log.info("cleaned {} old read statuses", total); - } - } while (!list.isEmpty()); + deleted = new UnitOfWork(sessionFactory) { + @Override + protected Integer runInSession() throws Exception { + List list = feedEntryStatusDAO.getOldStatuses(olderThan, BATCH_SIZE); + return feedEntryStatusDAO.delete(list); + } + }.run(); + total += deleted; + log.info("cleaned {} old read statuses", total); + } while (deleted != 0); log.info("cleanup done: {} old read statuses deleted", total); return total; } diff --git a/src/main/java/com/commafeed/backend/task/OldStatusesCleanupTask.java b/src/main/java/com/commafeed/backend/task/OldStatusesCleanupTask.java index 498e7dd7..b765f6a1 100644 --- a/src/main/java/com/commafeed/backend/task/OldStatusesCleanupTask.java +++ b/src/main/java/com/commafeed/backend/task/OldStatusesCleanupTask.java @@ -5,32 +5,22 @@ import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; -import org.hibernate.SessionFactory; - import com.commafeed.CommaFeedConfiguration; -import com.commafeed.backend.dao.UnitOfWork; import com.commafeed.backend.service.DatabaseCleaningService; import com.commafeed.backend.task.SchedulingService.ScheduledTask; @RequiredArgsConstructor public class OldStatusesCleanupTask implements ScheduledTask { - private final SessionFactory sessionFactory; private final CommaFeedConfiguration config; private final DatabaseCleaningService cleaner; @Override public void run() { - new UnitOfWork(sessionFactory) { - @Override - protected Void runInSession() throws Exception { - Date threshold = config.getApplicationSettings().getUnreadThreshold(); - if (threshold != null) { - cleaner.cleanStatusesOlderThan(threshold); - } - return null; - } - }.run(); + Date threshold = config.getApplicationSettings().getUnreadThreshold(); + if (threshold != null) { + cleaner.cleanStatusesOlderThan(threshold); + } } @Override diff --git a/src/main/java/com/commafeed/backend/task/OrphansCleanupTask.java b/src/main/java/com/commafeed/backend/task/OrphansCleanupTask.java index 74835027..5691fe8b 100644 --- a/src/main/java/com/commafeed/backend/task/OrphansCleanupTask.java +++ b/src/main/java/com/commafeed/backend/task/OrphansCleanupTask.java @@ -4,29 +4,19 @@ import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; -import org.hibernate.SessionFactory; - -import com.commafeed.backend.dao.UnitOfWork; import com.commafeed.backend.service.DatabaseCleaningService; import com.commafeed.backend.task.SchedulingService.ScheduledTask; @RequiredArgsConstructor public class OrphansCleanupTask implements ScheduledTask { - private final SessionFactory sessionFactory; private final DatabaseCleaningService cleaner; @Override public void run() { - new UnitOfWork(sessionFactory) { - @Override - protected Void runInSession() throws Exception { - cleaner.cleanEntriesWithoutSubscriptions(); - cleaner.cleanFeedsWithoutSubscriptions(); - cleaner.cleanContentsWithoutEntries(); - return null; - } - }.run(); + cleaner.cleanEntriesWithoutSubscriptions(); + cleaner.cleanFeedsWithoutSubscriptions(); + cleaner.cleanContentsWithoutEntries(); } @Override