Вопрос по включению кэша для сущности

Тоже решил посмотреть работу с кэшем.
Итак, согласно инструкции, добавил в app.properties модуля core следующие строки:

eclipselink.cache.shared.wedb$Country = true
eclipselink.cache.size.wedb$Country = 50 

Для датасета browse-экрана установил свойство cacheble

    <dsContext>
        <groupDatasource id="countriesDs"
                         class="com.borets.wedb.entity.Country"
                         view="country-with-group"
                         cacheable="true">
            <query>
                <![CDATA[select e from wedb$Country e]]>
            </query>
        </groupDatasource>
    </dsContext>

При открытии этого экрана ловлю в профайлер следующие одиночные запросы:

exec sp_executesql N'SELECT t1.ID, t1.CODE, t1.CREATE_TS, t1.CREATED_BY, t1.DELETE_TS, t1.DELETED_BY, t1.NAME, t1.SEC_GROUP_ID, t0.ID, t0.CREATE_TS, t0.CREATED_BY, t0.DELETE_TS, t0.DELETED_BY, t0.NAME, t0.UPDATE_TS, t0.UPDATED_BY, t0.VERSION, t0.PARENT_ID, t2.ID, t2.CREATE_TS, t2.CREATED_BY, t2.DELETE_TS, t2.DELETED_BY, t2.NAME, t2.UPDATE_TS, t2.UPDATED_BY, t2.VERSION, t2.PARENT_ID FROM WEDB_COUNTRY t1 LEFT OUTER JOIN SEC_GROUP t0 ON (t0.ID = t1.SEC_GROUP_ID) LEFT OUTER JOIN SEC_GROUP t2 ON (t2.ID = t0.PARENT_ID) WHERE ((t1.ID = @P0) AND (t1.DELETE_TS IS NULL))        ',N'@P0 nvarchar(4000)',N'9ED1076E-7712-BFB7-659E-FF952B07580C'

exec sp_executesql N'SELECT t1.ID, t1.CODE, t1.CREATE_TS, t1.CREATED_BY, t1.DELETE_TS, t1.DELETED_BY, t1.NAME, t1.SEC_GROUP_ID, t0.ID, t0.CREATE_TS, t0.CREATED_BY, t0.DELETE_TS, t0.DELETED_BY, t0.NAME, t0.UPDATE_TS, t0.UPDATED_BY, t0.VERSION, t0.PARENT_ID, t2.ID, t2.CREATE_TS, t2.CREATED_BY, t2.DELETE_TS, t2.DELETED_BY, t2.NAME, t2.UPDATE_TS, t2.UPDATED_BY, t2.VERSION, t2.PARENT_ID FROM WEDB_COUNTRY t1 LEFT OUTER JOIN SEC_GROUP t0 ON (t0.ID = t1.SEC_GROUP_ID) LEFT OUTER JOIN SEC_GROUP t2 ON (t2.ID = t0.PARENT_ID) WHERE ((t1.ID = @P0) AND (t1.DELETE_TS IS NULL))        ',N'@P0 nvarchar(4000)',N'22209CE4-82E4-F967-17CE-71765C2D0DDE'

И так далее для каждой записи датасета. Записей 11, поэтому они должны влезть в кэш.

В чем моя ошибка?

Добавлю, что MBean “ROOT-core.cuba:type=QueryCacheSupport”

java.lang.String printCacheContent()

возвращает

Operation invoked successfully with result:
Query{"select e from wedb$Employee e", id=90b643ed-2edf-f641-61b6-ca5a7710c0ac, firstRow=0, maxRows=50, softDeletion=true, positionalParameters=null, namedParameters=null}, instance count: 2
Query{"select e from wedb$Country e", id=04026a6d-e4dd-61c4-8b87-00a1e2214276, firstRow=0, maxRows=50, softDeletion=true, positionalParameters=null, namedParameters=null}, instance count: 11

image

Михаил, у вас сейчас в КЭШе находятся Страны, но Групп в КЭШе нету. Скорее всего идут запросы на загрузку Стран вместе с Группами, из-за того что сущность Группа не в КЭШе.

2 симпатии

Спасибо. Действительно в Страну добавлен атрибут многие-к-одному sec$Group. Но при добавлении этой сущности в кэш, получаю ошибку:

Сведения
java.lang.IllegalStateException: Cannot get unfetched attribute [] from detached object .
	at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.throwUnfetchedAttributeException(DatabaseValueHolder.java:327)
	at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:95)
	at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:174)
	at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:235)
	at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:101)
	at com.borets.wedb.entity.Country._persistence_get_secGroup(Country.java)
	at com.borets.wedb.entity.Country.getSecGroup(Country.java:47)
	at sun.reflect.GeneratedMethodAccessor190.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.haulmont.chile.core.model.utils.MethodsCache.invokeGetter(MethodsCache.java:72)
	at com.haulmont.chile.core.model.impl.AbstractInstance.getValue(AbstractInstance.java:102)
	at com.haulmont.cuba.core.entity.BaseGenericIdEntity.getValue(BaseGenericIdEntity.java:139)
	at com.haulmont.cuba.core.sys.EntityFetcher.fetch(EntityFetcher.java:126)
	at com.haulmont.cuba.core.sys.EntityFetcher.fetch(EntityFetcher.java:66)
	at com.haulmont.cuba.core.sys.QueryImpl.lambda$getFirstResult$4(QueryImpl.java:390)
	at com.haulmont.cuba.core.sys.QueryImpl.getResultFromCache(QueryImpl.java:659)
	at com.haulmont.cuba.core.sys.QueryImpl.getFirstResult(QueryImpl.java:384)
	at com.haulmont.cuba.core.sys.EntityManagerImpl.findWithViews(EntityManagerImpl.java:204)
	at com.haulmont.cuba.core.sys.EntityManagerImpl.find(EntityManagerImpl.java:176)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.haulmont.cuba.core.sys.PersistenceImpl$EntityManagerInvocationHandler.invoke(PersistenceImpl.java:384)
	at com.sun.proxy.$Proxy330.find(Unknown Source)
	at com.haulmont.cuba.core.sys.entitycache.QueryCacheManager.getResultListFromCache(QueryCacheManager.java:100)
	at com.haulmont.cuba.core.sys.QueryImpl.getResultFromCache(QueryImpl.java:638)
	at com.haulmont.cuba.core.sys.QueryImpl.getResultList(QueryImpl.java:342)
	at com.haulmont.cuba.core.app.RdbmsStore.executeQuery(RdbmsStore.java:703)
	at com.haulmont.cuba.core.app.RdbmsStore.getResultList(RdbmsStore.java:611)
	at com.haulmont.cuba.core.app.RdbmsStore.loadList(RdbmsStore.java:210)
	at com.haulmont.cuba.core.app.DataManagerBean.loadList(DataManagerBean.java:84)
	at sun.reflect.GeneratedMethodAccessor223.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.haulmont.cuba.core.app.DataManagerBean$SecureDataManagerInvocationHandler.invoke(DataManagerBean.java:362)
	at com.sun.proxy.$Proxy395.loadList(Unknown Source)
	at com.haulmont.cuba.core.app.DataServiceBean.loadList(DataServiceBean.java:51)
	at sun.reflect.GeneratedMethodAccessor222.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
	at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:117)
	at sun.reflect.GeneratedMethodAccessor183.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy247.loadList(Unknown Source)
	at sun.reflect.GeneratedMethodAccessor221.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94)
	at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:154)
	at com.sun.proxy.$Proxy34.loadList(Unknown Source)
	at com.haulmont.cuba.client.sys.DataManagerClientImpl.loadList(DataManagerClientImpl.java:53)
	at com.haulmont.cuba.gui.data.impl.GenericDataSupplier.loadList(GenericDataSupplier.java:102)
	at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.loadData(CollectionDatasourceImpl.java:613)
	at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.refresh(CollectionDatasourceImpl.java:161)
	at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.refresh(CollectionDatasourceImpl.java:119)
	at com.haulmont.cuba.gui.data.impl.GroupDatasourceImpl.setSuspended(GroupDatasourceImpl.java:191)
	at com.haulmont.cuba.gui.data.impl.DsContextImpl.resumeSuspended(DsContextImpl.java:84)
	at com.haulmont.cuba.gui.WindowManager.afterShowWindow(WindowManager.java:1164)
	at com.haulmont.cuba.web.WebWindowManager.showWindow(WebWindowManager.java:422)
	at com.haulmont.cuba.gui.WindowManager.openWindow(WindowManager.java:756)
	at com.haulmont.cuba.web.WebWindowManager.openWindow(WebWindowManager.java:158)
	at com.haulmont.cuba.gui.config.MenuCommand$ScreenCommand.run(MenuCommand.java:181)
	at com.haulmont.cuba.gui.config.MenuCommand.execute(MenuCommand.java:76)
	at com.haulmont.cuba.web.sys.SideMenuBuilder.lambda$createMenuCommandExecutor$0(SideMenuBuilder.java:180)
	at com.haulmont.cuba.web.gui.components.mainwindow.WebSideMenu$MenuItemImpl.lambda$setCommand$0(WebSideMenu.java:481)
	at com.haulmont.cuba.web.toolkit.ui.CubaSideMenu$1.menuItemTriggered(CubaSideMenu.java:83)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:444)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:409)
	at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
	at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:312)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:203)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107)
	at jespa.http.HttpSecurityService.doFilter(HttpSecurityService.java:1596)
	at com.borets.wedb.web.JespaAuthProvider.doFilter(JespaAuthProvider.java:94)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:112)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

аналогично как в топике Ошибка при включении кэша сущностей.

Там @krivopustov советовал включить в кэш связанные сущности. Но у меня таковых больше не имеется:
image
Или нужно по цепочки еще включать для sec$Group: SessionAttribute, Constraint, GroupHierarchy?

А какая версия у вас платформы? В 6.9.5 делалось еще исправление по https://github.com/cuba-platform/cuba/issues/1155. Возможно это временно решит проблему.

Да, версия именно 6.9.5 Что еще можно проверить?

Или нужно по цепочки еще включать для sec$Group: SessionAttribute, Constraint, GroupHierarchy?

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

Мы сейчас занимаемся проблемой https://github.com/cuba-platform/cuba/issues/1200, возможно ее удастся решить в ближайшую неделю - две.

2 симпатии

Попробовал включить для следующих сущностей:

eclipselink.cache.shared.wedb$Country = true
eclipselink.cache.size.wedb$Country = 50
eclipselink.cache.shared.sec$Group = true
eclipselink.cache.shared.sec$SessionAttr = true
eclipselink.cache.shared.sec$Constraint = true
eclipselink.cache.shared.sec$GroupHierarchy = true

В итоге ошибки нет, но в профайлере опять запросы, правда уже другие:

exec sp_executesql N'SELECT ID, CODE, CREATE_TS, CREATED_BY, DELETE_TS, DELETED_BY, NAME, SEC_GROUP_ID FROM WEDB_COUNTRY WHERE ((ID = @P0) AND (DELETE_TS IS NULL))        ',N'@P0 nvarchar(4000)',N'22209CE4-82E4-F967-17CE-71765C2D0DDE'

Михайл,
А не смогли бы вы приложить тестовый проект для крайнего случая, когда включено кэширование для всех сущностей и происходит обращение к БД.

Спасибо

Собственно никаких хитростей там нет, что скорее всего наводит на мысль, что это я где-то ошибся.
cacheTest.zip (76,5 КБ)

Михаил, спасибо за проект.
Посмотрим его в ближайшее время.
Так же исправили проблему описанную в Ошибка при включении кэша сущностей в версии платформы 6.9.6

Спасибо. Попробую.
Ее еще нет в репозитории? Что-то нет в настройках проекта доступной версии.

Версия 6.9.6 выпущена 21.09.2018, проверьте, пожалуйста, что она доступна

Да, доступна. Перезапуск студии решил вопрос тогда.

Михаил, удалось воспроизвести проблему. Спасибо за проект. Ошибка воспроизводится только для MSSQL и UUID сущностей. Тикет: https://github.com/cuba-platform/cuba/issues/1308

1 симпатия

Михаил, добрый день!

Удалось исправить проблему с кэшированием, по проекту приложенному к топику. Исправили в версии 6.9.7.

Спасибо

3 симпатии

Андрей, спасибо за работу.
Вопрос с Country решен. Но…
Включив кеш для другой сущности

eclipselink.cache.shared.wedb$ServiceFacility=true
eclipselink.cache.size.wedb$ServiceFacility=100

у которой есть ссылочный атрибут на Country (отношение многие-к-одному), я вижу, что кеширование не работает:

exec sp_executesql N'SELECT ID, COORDINATE_LATITUDE, COORDINATE_LONGITUDE, CREATE_TS, CREATED_BY, DELETE_TS, DELETED_BY, NAME, COUNTRY_ID FROM WEDB_SERVICE_FACILITY WHERE ((COUNTRY_ID = @P0) AND (DELETE_TS IS NULL))        ',N'@P0 nvarchar(4000)',N'1B51B2EF-8864-F9ED-3ACE-B4B3942387CF'

Да, в этом запросе накладывает constraint. Но по идее он тоже включен в кеш. Я, видимо, все еще чего-то не понимаю.

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

1 симпатия