Skip to content

Instantly share code, notes, and snippets.

@omidp
Last active September 6, 2024 06:59
Show Gist options
  • Save omidp/f4ac36fa1997c6c2e9f65f3959006f0f to your computer and use it in GitHub Desktop.
Save omidp/f4ac36fa1997c6c2e9f65f3959006f0f to your computer and use it in GitHub Desktop.
Hibernate query cache
@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;
}
@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);
}
});
});
}
}
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
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
<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