Last active
September 6, 2024 06:59
-
-
Save omidp/f4ac36fa1997c6c2e9f65f3959006f0f to your computer and use it in GitHub Desktop.
Hibernate query cache
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Entity | |
@Table(name = "category_detail") | |
@Data | |
@NoArgsConstructor | |
@AllArgsConstructor | |
@EqualsAndHashCode(of = "id") | |
public class CategoryDetailEntity { | |
@Id | |
@Column(name = "category_id") | |
private Long id; | |
@Column(name = "img", length = 2147483647) | |
@Lob | |
private Blob image; | |
@Column(name = "icon", length = 2147483647) | |
@Lob | |
private Blob icon; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@RequiredArgsConstructor | |
public class CategoryImageViewerServlet extends HttpServlet { | |
private final ManagedCrudService categoryImageDao; | |
@Override | |
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { | |
Long imageId = Long.valueOf(request.getPathInfo().substring(1)); | |
categoryImageDao.inTransaction(session -> { | |
//TODO: cache | |
session.createSelectionQuery("from CategoryDetailEntity c where c.id = :cid", CategoryDetailEntity.class) | |
.setParameter("cid", imageId) | |
.setCacheable(true) | |
.uniqueResultOptional() | |
.ifPresent(categoryDetail -> { | |
response.setContentType("image/jpg"); | |
response.setHeader("Content-disposition", String.format("inline; filename=\"%s.jpg\"", imageId)); | |
try (OutputStream os = response.getOutputStream(); InputStream is = categoryDetail.getImage().getBinaryStream()) { | |
IOUtil.fastCopy(is, os); | |
} catch (SQLException e) { | |
throw new RuntimeException(e); | |
} catch (IOException e) { | |
throw new RuntimeException(e); | |
} | |
}); | |
}); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Hibernate: | |
select | |
cde1_0.category_id, | |
cde1_0.icon, | |
cde1_0.img | |
from | |
category_detail cde1_0 | |
where | |
cde1_0.category_id=? | |
2024-09-06T08:38:35.741+02:00 INFO 10528 --- [core-service] [nio-8281-exec-5] .e.DefaultPersistenceExceptionTranslator : RuntimeException | |
java.lang.IllegalStateException: Blobs may not be accessed after serialization | |
at org.hibernate.engine.jdbc.SerializableBlobProxy.getWrappedBlob(SerializableBlobProxy.java:47) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at org.hibernate.engine.jdbc.SerializableBlobProxy.invoke(SerializableBlobProxy.java:60) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at jdk.proxy2/jdk.proxy2.$Proxy200.getBinaryStream(Unknown Source) ~[na:na] | |
at com.moomra.core.app.web.CategoryImageViewerServlet.lambda$doGet$0(CategoryImageViewerServlet.java:37) ~[classes/:na] | |
at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[na:na] | |
at com.moomra.core.app.web.CategoryImageViewerServlet.lambda$doGet$1(CategoryImageViewerServlet.java:34) ~[classes/:na] | |
at com.moomra.core.data.ManagedSessionFactory.lambda$inTransaction$1(ManagedSessionFactory.java:38) ~[data-0.0.1-SNAPSHOT.jar:na] | |
at org.hibernate.internal.TransactionManagement.manageTransaction(TransactionManagement.java:22) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at org.hibernate.SessionFactory.lambda$inTransaction$0(SessionFactory.java:237) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at org.hibernate.SessionFactory.inSession(SessionFactory.java:217) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at org.hibernate.SessionFactory.inTransaction(SessionFactory.java:237) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] | |
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] | |
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:519) ~[spring-orm-6.1.12.jar:6.1.12] | |
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:735) ~[spring-orm-6.1.12.jar:6.1.12] | |
at jdk.proxy2/jdk.proxy2.$Proxy155.inTransaction(Unknown Source) ~[na:na] | |
at com.moomra.core.data.ManagedSessionFactory.inTransaction(ManagedSessionFactory.java:35) ~[data-0.0.1-SNAPSHOT.jar:na] | |
at com.moomra.core.data.orm.service.ManagedCrudService.inTransaction(ManagedCrudService.java:42) ~[data-0.0.1-SNAPSHOT.jar:na] | |
at com.moomra.core.app.web.CategoryImageViewerServlet.doGet(CategoryImageViewerServlet.java:28) ~[classes/:na] | |
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.28.jar:6.0] | |
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.28.jar:6.0] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] | |
2024-09-06T08:38:35.757+02:00 ERROR 10528 --- [core-service] [nio-8281-exec-5] c.c.C.[.[.[.[merchantImageViewerServlet] : Servlet.service() for servlet [merchantImageViewerServlet] in context with path [] threw exception | |
com.moomra.core.data.orm.exception.DefaultPersistenceExceptionTranslator$2: Blobs may not be accessed after serialization | |
at com.moomra.core.data.orm.exception.DefaultPersistenceExceptionTranslator.translateExceptionIfPossible(DefaultPersistenceExceptionTranslator.java:28) ~[data-0.0.1-SNAPSHOT.jar:na] | |
at com.moomra.core.data.orm.service.ManagedCrudService.inTransaction(ManagedCrudService.java:44) ~[data-0.0.1-SNAPSHOT.jar:na] | |
at com.moomra.core.app.web.CategoryImageViewerServlet.doGet(CategoryImageViewerServlet.java:28) ~[classes/:na] | |
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.28.jar:6.0] | |
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.28.jar:6.0] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.12.jar:6.1.12] | |
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.28.jar:10.1.28] | |
at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] | |
Caused by: java.lang.IllegalStateException: Blobs may not be accessed after serialization | |
at org.hibernate.engine.jdbc.SerializableBlobProxy.getWrappedBlob(SerializableBlobProxy.java:47) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at org.hibernate.engine.jdbc.SerializableBlobProxy.invoke(SerializableBlobProxy.java:60) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at jdk.proxy2/jdk.proxy2.$Proxy200.getBinaryStream(Unknown Source) ~[na:na] | |
at com.moomra.core.app.web.CategoryImageViewerServlet.lambda$doGet$0(CategoryImageViewerServlet.java:37) ~[classes/:na] | |
at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[na:na] | |
at com.moomra.core.app.web.CategoryImageViewerServlet.lambda$doGet$1(CategoryImageViewerServlet.java:34) ~[classes/:na] | |
at com.moomra.core.data.ManagedSessionFactory.lambda$inTransaction$1(ManagedSessionFactory.java:38) ~[data-0.0.1-SNAPSHOT.jar:na] | |
at org.hibernate.internal.TransactionManagement.manageTransaction(TransactionManagement.java:22) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at org.hibernate.SessionFactory.lambda$inTransaction$0(SessionFactory.java:237) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at org.hibernate.SessionFactory.inSession(SessionFactory.java:217) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at org.hibernate.SessionFactory.inTransaction(SessionFactory.java:237) ~[hibernate-core-6.6.0.Final.jar:6.6.0.Final] | |
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] | |
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] | |
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:519) ~[spring-orm-6.1.12.jar:6.1.12] | |
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:735) ~[spring-orm-6.1.12.jar:6.1.12] | |
at jdk.proxy2/jdk.proxy2.$Proxy155.inTransaction(Unknown Source) ~[na:na] | |
at com.moomra.core.data.ManagedSessionFactory.inTransaction(ManagedSessionFactory.java:35) ~[data-0.0.1-SNAPSHOT.jar:na] | |
at com.moomra.core.data.orm.service.ManagedCrudService.inTransaction(ManagedCrudService.java:42) ~[data-0.0.1-SNAPSHOT.jar:na] | |
... 40 common frames omitted |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
jpa: | |
hibernate: | |
ddl-auto: update | |
show-sql: true | |
open-in-view: false | |
database: postgresql | |
generate-ddl: true | |
properties: | |
hibernate: | |
javax: | |
cache: | |
provider: com.github.benmanes.caffeine.jcache.spi.CaffeineCachingProvider | |
cache: | |
use_second_level_cache: true | |
region: | |
factory_class: jcache | |
use_query_cache: true | |
dialect: org.hibernate.dialect.PostgreSQLDialect | |
format_sql: true |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<dependency> | |
<groupId>org.hibernate.orm</groupId> | |
<artifactId>hibernate-jcache</artifactId> | |
<version>${hibernate.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>com.github.ben-manes.caffeine</groupId> | |
<artifactId>jcache</artifactId> | |
<version>3.1.8</version> | |
</dependency> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment