Управление памятью в спящем режиме - PullRequest
3 голосов
/ 26 января 2011

У меня есть приложение, которое использует спящий режим. В одной части я пытаюсь получить документы. Каждый документ имеет номер счета. Модель выглядит примерно так:

    private Long _id;
private String _acct;  
private String _message;  
private String _document;    
private String _doctype;  
private Date _review_date;  

Затем я получаю документы с помощью службы документов. Часть кода здесь:

public List<Doc_table> getDocuments(int hours_, int dummyFlag_,List<String> accts) {
        List<Doc_table> documents = new ArrayList<Doc_table>();
    Session session = null;
    Criteria criteria = null;
    try {
        // Lets create a previous Date by subtracting the number of
        // subtractHours_ passed.
        session = HibernateUtil.getSession();
        session.beginTransaction();
        if (accts == null) {
            Calendar cutoffTime = Calendar.getInstance();
            cutoffTime.add(Calendar.HOUR_OF_DAY, hours_);
            criteria = session.createCriteria(Doc_table.class).add(
                    Restrictions.gt("dbcreate_date",  cutoffTime.getTime()))
                    .add(Restrictions.eq("dummyflag", dummyFlag_));
        } else 
        {   criteria = session.createCriteria(Doc_table.class).add(Restrictions.in("acct", accts));
        }
        documents = criteria.list();
        for (int x = 0; x < documents.size(); x++) {
            Doc_table document = documents.get(x);
               ......... more stuff here
                    }

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

Все, что я действительно хочу сделать, это получить каждый документ, который соответствует моим критериям, захватить номер счета и вернуть список номеров счетов (объект намного меньший, чем список объектов). Если бы это был jdbc, я бы точно знал, что делать.

Но в этом случае я в тупике. Я думаю, что я ищу способ, которым я могу принести просто вернуть номера счетов объекта Doc_table.

Или, альтернативно, каким-то образом, где я могу получать документы по одному из базы данных, используя режим гибернации, который соответствует моим критериям (вместо того, чтобы возвращать весь Список объектов, который использует слишком много памяти).

Ответы [ 2 ]

6 голосов
/ 26 января 2011

Существует несколько способов решения проблемы:

  • загрузка документов в пакетах меньшего размера
  • (как вы заметили) не запрашивать документ, а только номера счетов:

    List accts = session.createQuery ("SELECT d._acct ОТ Doc d WHERE ...");

или

 List<String> accts = session.createCriteria(Doc.class).
             setProjection(Projections.property("_acct")).
             list();
  • Если в вашем классе документов есть специальное поле, содержащее огромное количество байтов данных документа, то вы можете отобразить это специальное поле как поле с отложенной загрузкой.
  • Создайте второй класс сущностей (только для чтения), который содержит только те поля, которые вам нужны, и сопоставьте его с той же таблицей
0 голосов
/ 26 января 2011

Вместо извлечения всех документов, т. Е. Всех записей одновременно, попытайтесь ограничить число извлекаемых строк. Кроме того, разверните стратегию, в которой вы можете временно хранить документы в виде плоских файлов и извлекать их позже или удалять после использования. Хотя это довольно долгий процесс, это эффективный способ обработки и доставки документов из базы данных.

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