Форумы

Официальные форумы на Liferay.com: www.liferay.com/community/forums

Русский форум на Liferay.com: www.liferay.com/community/forums/-/message_boards/category/3428484

Всегда имеет смысл посмотреть и написать там - так как аудитория значительно больше.

Но если по каким-то причинам на Liferay.com писать не хочется - велком к обсуждению тут :)

Combination View Flat View Tree View
Threads [ Previous | Next ]
RE: ServiseBuilder 6.1 getEntityCount() и КЭШ
toggle
Появилась необходимость перетащить разработку портлета с версии портала 6.0.6 на 6.1.
Соответственно, я все переделал под Liferay Plugins SDK 6.1( ServiseBuilder построил заного).

Задача портлета записать значение в таблицу после чего отобразить все записи в таблице вместе с последней добавленной.

MyEntity - единственный ентити который я использовал.

Портлет после переноса заработал, вот только появилась маленькая проблема:

При записи значения в таблицу оно там появляется, но NoteLocalServiceUtil.getMyEntityCount() показывает количество Entity до добавления (то есть на 1 меньше).
NoteLocalServiceUtil - физически содержит новую запись (NoteLocalServiceUtil.getMyEntitys - возвращает все, в том числе и последнюю добавленную ).

Получается, проблема только в getMyEntityCount().

Полез я туда внутрь и вот что нашел:

 1
 2public int countAll() throws SystemException { 
 3
 4        Long count = (Long)FinderCacheUtil.getResult(FINDER_PATH_COUNT_ALL,
 5                FINDER_ARGS_EMPTY, this);
 6
 7        if (count == null) {
 8            Session session = null;
 9
10            try {
11                session = openSession();
12
13                Query q = session.createQuery(_SQL_COUNT_NOTE);
14
15                count = (Long)q.uniqueResult();
16            }
17            catch (Exception e) {
18                throw processException(e);
19            }
20            finally {
21                if (count == null) {
22                    count = Long.valueOf(0);
23                }
24
25                FinderCacheUtil.putResult(FINDER_PATH_COUNT_ALL,
26                    FINDER_ARGS_EMPTY, count);
27
28                closeSession(session);
29            }
30        }
31
32        return count.intValue();
33    }


Как я понял, он делает запрос к СУБД если не находит нужных значений в кеше.
То есть, в моем случае, оно увидело что в кеше есть все что нужно и взяло старое значение оттуда, хотя оно давно изменилось .


Время поджимает и я решил проблему по простому:

Сначала очистил кэш :
1FinderCacheUtil.clearCache();

Только потом вызвал метод
1NoteLocalServiceUtil.getMyEntityCount()


Теперь все работает.

Незнаю правильно ли так делать, позже буду разбираться, но пока все работает как надо.
Flag Flag
А Как запись попадает в базу?
По идее если вы используется стандартные методы notePeristence.update - то он должен чистить кеш. Если он этого не делает - то это бага в Liferay - надо копать и репортить в JIRA

Если вы добавляете прямым запросом в базу - то тогда да - это уже ваша обязанность очистить при этом кеш.

Если запись добавляется в базу третьей системой - то это вообще плохо - напрямую с забой я бы не работал (потому что можно большие проблему огрести с тем же кешем) - а работал бы например через SOAP - АПИ которое можно сгенерить в кашему сервису автоматически

Сами с таким не сталкивались - вроде все нормально добавляет и потом выдает count
Flag Flag
RE: ServiseBuilder 6.1 getEntityCount() и КЭШ
3/13/12 5:08 AM as a reply to Alexey Kakunin.
Все делаю через ServiseBuilder.
Добавляю entity так:
1 myEntityLocalServiceUtil.addmyEntity(myentity);


Может быть дело в том что я использую add a не update(),но в 6.0 вродебы работало и так;
Flag Flag
add внутри себя должен вызвать update persistence-класса. Главное что вы делаете добавление штатными средствами - в этом случае Liferay должен адекватно чистить кеш.

Тогда необходимо лезть дебагерром в add и смотреть почему этого не происходит

ТО есть я к чему - правильное исправление ошибки - это чистка кеша при добавлении - а не перед получением count-а.
Обычно изменения данных (добавление) происходит реже чем их чтение (например получение count-а) - так что тут явно выигрыш по производительности

Да и в целом - если кеш не чистится адекватно - это потенциальный источник больших проблем.
Flag Flag
RE: ServiseBuilder 6.1 getEntityCount() и КЭШ
3/20/12 4:46 AM as a reply to Alexey Kakunin.
Также появилась проблема:

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

У меня там есть уже 5 значений которые нормально передаются.

То есть примерно так :

1.jsp ---> servlet --> 2.jsp

Так вот, новое значение в сервлет нормально передается, а вот уже из сервлета никак не передается.
делаю так:
1,jsp - Работает, вызывает метод
1
2PortletURL copyURL = renderResponse.createActionURL();
3copyURL.setParameter(ActionRequest.ACTION_NAME, "copytext");
4потом сабмит формы с вызовом этого метода


copytext

1
2String idSector = ParamUtil.getString(actionRequest, "sectorSelector"); - работает
3actionResponse.setRenderParameter("useridsector", idSector); - работает
4actionResponse.setRenderParameter("jspPage", redirectURL);


2.jsp

1
2String sectorSelector2 = renderRequest.getParameter("useridsector").toString(); - работает



Короче, все нормально работает, но как только я добавляю новый параметр, портлет перестаёт работать.

JSP страницы работают верно, не работает метод в сервлете.

то есть параметр отправляется в сервлет, но уже оттуда не возвращается (renderRequest несодержит такого параметра).

метод как будто не видит мою добавленную строку кода.
Такое чувство что опять тут что то нечисто с кэшем или я просто что то конкретно сломал.
Flag Flag
После того как перенес проект полностью в MacOS (на другую машину) все заработало.
Видимо был поврежден Liferay SDK.

Кеш пока непроверял.
Flag Flag