Как автоматически вывести данные из памяти через 5 минут - PullRequest
1 голос
/ 22 марта 2011

У меня есть TableHandler, который реализует логику загрузки / перезагрузки таблицы.Под таблицей я подразумеваю данные, загружаемые с диска или из памяти, когда пользователь запрашивает их в форме объекта таблицы.Если приходит новый запрос и экземпляр таблицы находится в памяти, я просто загружаю таблицу из памяти и не перезагружаю ее с диска.Если нужной мне таблицы нет в памяти, я просто загружаю таблицу с диска.Теперь, когда мой запрос увеличивается, многие таблицы хранятся в памяти, поэтому я хочу автоматически освободить некоторые таблицы из памяти, скажем, через 5 минут, которые не были обработаны в течение 5 минут.Как я могу это реализовать?У меня есть структура класса tablehandler как это

final class TableHandler{

   /*
   Data struct for storing information required for management 
   of the loaded table    instances
   */

    final static class Tableinfo{

       /*
       Table instance.. and other things like table when 
       last modified and whether to referench the table 
       when a next request arrives.
       */

    }

    getTable(){someInternalTableHandler.getTable()}

    replacetable {someInternalTableHandler.replacetable()}

    //Handles loading/reloading logic.

    final static class someInternalTablehandler{

        getTable(){...}
        createTableInstance(){...}
        replaceTable{...}

    } 
}

Как я могу реализовать вышеупомянутую логику в мой код .... ??

Ответы [ 4 ]

2 голосов
/ 22 марта 2011

Это звучит так же, как кэш таблиц в памяти.Взгляните на решения для Java-кэширования, такие как EHCache, которые решают эту проблему и многое другое.

Если вы хотите сделать это самостоятельно, добавьте метку времени в свой класс Tableinfo, чтобы сохранить время последнего доступа.Затем используйте задачу таймера, поскольку jzd предлагает просмотреть список TableInfo в поисках тех, которые должны быть «выгружены».

Проверьте здесь для примера использования Timer и TimerTask

1 голос
/ 22 марта 2011

Два варианта:

  1. Если ваша цель - обновить данные, чтобы дублирующие запросы в конечном итоге увидели новые данные. Затем просто добавьте Date в ваш класс Tableinfo, когда данные извлекались последними. Затем используйте копию из памяти, только если дата указана в последние пять минут.
  2. Если ваша цель - уменьшить использование памяти и у вас много таблиц, то создайте новый таймер, который через 5 минут выполняет функцию TimerTask, которая удаляет таблицу из памяти.
0 голосов
/ 22 марта 2011

Вы можете использовать Guava MapMaker для этого: http://guava -libraries.googlecode.com / SVN / багажник / Javadoc / COM / Google / общие / собирать / MapMaker.html

Map map = new MapMaker().expireAfterWrite(5, TimeUnit.MINUTES).makeMap();

Если вы не хотите жестко задавать его время, вы можете использовать мягкие ссылки для ваших значений в созданной карте. Это приведет к тому, что значения вашей карты будут отброшены, если на них больше нет ссылок, а JVM не хватает памяти.

Прокрутить собственную карту, которая использует слабые / мягкие ссылки, чтобы очистить себя, тоже не сложно. Взгляните на ReferenceQueue , WeakReference и SoftReference

Есть некоторые проекты, которые позволяют аннотировать метод с помощью @Cache, и все возвращаемые значения этого метода будут кэшироваться и очищаться, когда на них больше не ссылаются. http://code.google.com/p/tantalizing-eats/

0 голосов
/ 22 марта 2011

Если я правильно вас понимаю, классы java.lang.ref.WeakReference и java.lang.ref.SoftReference могут быть тем, что вы ищете.

Если только слабая ссылка ведет себя так, как если бы вы освободили все ссылки на объектпозволяя GC очищать его, когда захочет.Если сборщик мусора не очистил ваш стол, вы все равно можете использовать его, если он очистил его, вам потребуется перезагрузить его.Мягкая ссылка похожа, но объект, как правило, будет храниться дольше и завершаться только в том случае, если у вас мало памяти.

Если вы хотите, чтобы какие-либо гарантии, подобные этим, были очищены после 5 минут бездействия, выВам придется использовать стороннюю библиотеку или делать что-то самостоятельно, ни один из встроенных классов этого не обеспечит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...