Having @ManyToMany(fetch=FetchType.EAGER)
attributes can slow down retrieval quite significantly (up to 40 times slower).
I recall reading somewhere that FetchType.EAGER
is the default for @ManyToMany
associations. Also, from experience I noticed that setting FetchType.LAZY
caused a org.hibernate.LazyInitializationException
thrown with exception message similar to, failed to lazily initialize a collection of role: com.xyz.domain.EntityOne.images, no session or session was closed
.
So, it seemed that the only other way to quickly reduce the time it took (for the retrieval) was to look into the caching options such as query caching, second-level caching, both of which are supported by Hibernate (the webapp’s JPA provider). For more information on second-level caching, please refer to this article.
Integrating Spring + JPA + Hibernate + Tomcat + EHCache took me a few hours this afternoon, but the effort paid off. The retrieval is now 40 times faster!
This post is summarizing the setup involved in getting them all to work together.
Relevant Section Of persistence.xml
:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.cache.provider_class"
value="org.hibernate.cache.SingletonEhCacheProvider" />
<property name="hibernate.cache.provider_configuration" value="/ehcache.xml" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
</properties>
Notes:
- The
persistence.xml
is located at {tomcat}/webapps/{your-webapp}/META-INF
.
- I used
org.hibernate.cache.SingletonEhCacheProvider
instead of org.hibernate.cache.EhCacheProvider
. I was getting a WARN message if I used org.hibernate.cache.EhCacheProvider
. I referred to this post for a fix.
Relevant Section Of ehcache.xml
:
<diskStore path="user.dir/mywebapp-special-cache-folder"/>
<defaultCache eternal="false" overflowToDisk="false"
maxElementsInMemory="1000" timeToIdleSeconds="30" timeToLiveSeconds="60"/>
<cache name="com.xyz.domain.EntityTwo" eternal="false" overflowToDisk="true"
maxElementsInMemory="1000" timeToIdleSeconds="300" timeToLiveSeconds="600"
diskPersistent="true" diskExpiryThreadIntervalSeconds="300"/>
<cache name="com.xyz.domain.EntityOne" eternal="false" overflowToDisk="true"
maxElementsInMemory="1000" timeToIdleSeconds="300" timeToLiveSeconds="600"
diskPersistent="true" diskExpiryThreadIntervalSeconds="300"/>
<cache name="com.xyz.domain.EntityOne.images" eternal="false"
overflowToDisk="true"
maxElementsInMemory="1000" timeToIdleSeconds="300" timeToLiveSeconds="600"
diskPersistent="true" diskExpiryThreadIntervalSeconds="300"/>
Notes:
- The
ehcache.xml
is located at {tomcat}/webapps/{your-webapp}/WEB-INF/classes
.
- The
diskStore
element indicates where the files to be used for caching will be stored for the entities I wish to be made persistent to disk. In my web application, the files are stored under {tomcat}/bin/{mywebapp-special-cache-folder}
-
diskPersistent="true"
indicates that the disk store (for the specific entity) is persistent between cache and VM restarts. Please refer to the EHCache documentation on disk storage for more information.
Relevant JARs: under {tomcat}/webapps/{your-webapp}/WEB-INF/lib
ehcache-core-2.0.1.jar
hibernate3.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.6.jar
- Spring 3.0.2 JARs..
Relevant Section Of Spring Configuration:
<!-- there should be a way out of hardcoding the location of the properties file -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/spring-hes-db.properties" />
</bean>
<!-- ENTITY MANAGER FACTORY -->
<!-- LocalEntityManagerFactoryBean did not work for me -->
<bean id="emf-p"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="pum"/>
<property name="persistenceUnitName" value="pu1"/>
<property name="dataSource" ref="dataSource-p" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL" />
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
</bean>
</property>
</bean>
<!-- TRANSACTION MANAGER -->
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf-p"/>
<property name="dataSource" ref="dataSource-p"/>
</bean>
<!-- DATA SOURCES -->
<bean id="dataSource-p"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://${db.host}:${db.port}/${db.name}"/>
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
<!-- JPA TEMPLATE -->
<bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate">
<property name="entityManagerFactory" ref="emf-p" />
</bean>
<!-- DAOs -->
<bean id="entityOneDao" class="hes.db.impl.EntityOneDAOImpl">
<property name="jpaTemplate" ref="jpaTemplate"/>
</bean>
<!-- PERSISTENCE UNIT -->
<bean id="pum"
class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="persistenceXmlLocations">
<list>
<value>META-INF/persistence.xml</value>
</list>
</property>
<property name="dataSources">
<map>
<entry key="remoteDataSource" value-ref="dataSource-p" />
</map>
</property>
<property name="defaultDataSource" ref="dataSource-p"/>
</bean>
分享到:
相关推荐
ORM框架:Spring Data JPA、hibernate 4.3.5.Final 日志管理:SLF4J 1.7.21、Log4j 编辑器:ueditor 工具类:Apache Commons、Jackson 2.8.5、POI 3.15 view层:JSP 数据库:mysql、oracle等关系型数据库 前端 dom ...
logging.jar log4j-1.2.14.jar spring-dao.jar spring-hibernate3.jar spring-ibatis.jar spring-jdbc.jar spring-jdo.jar spring-jpa.jar spring-toplink.jar persistence.jar ...
技术选型:Spring Data JPA、Hibernate、Shiro、 Spring MVC、Layer、MySQL 等。 简介: 1、天梯是一款使用Java编写的免费的轻量级CMS系统,目前提供了从后台管理到前端展现的整体解决方案。 2、用户可以不编写一句...
该项目基于Spring 3.1.3, Spring MVC, Hibernate 4.1.7, EhCache, Spring Data JPA 1.1.0, MySQL 5, Spring Security 3.1.3, Spring Mail, Recapcha等技术实现了网站注册、登录系统。项目包含了详尽的配置信息。 ...
ORM框架: Spring Data JPA、hibernate 4.3.5.Final 日志管理: SLF4J 1.7.21、I Log4j 编辑器: ueditor 工具类: Apache Commons、 Jackson 2.8.5、POI 3.15 view层:JSP 数据库: mysql
员工SpringMvcRest 使用spring mvc、spring data jpa、ehcache、jsp、javascript和apache tomcat进行员工管理。 描述:它是一个员工管理系统,作为 Web 和休息服务暴露给用户,用户可以使用它执行基本的 crud 操作,...
快速入门通常涉及创建一个新的Spring Boot项目,引入必要的起步依赖,并编写主应用类,启动内嵌的Tomcat服务器。 2. **工程配置**:Spring Boot 使用 `application.properties` 或 `application.yml` 文件进行配置...
10. **数据库支持(Database Support)**:包括JDBC、JPA(Hibernate)、MyBatis等,Spring Boot 提供了对多种数据库的开箱即用支持。 在"spring cloud基础搭建demo"中,我们将关注Spring Cloud的相关知识点: 1. ...
这个“spring boot 所有‘demo,打包下载’”的资源集合是一个极好的学习材料,涵盖了 Spring Boot 的多个关键领域,包括 JPA、Tomcat、Cache、Ant、Hibernate 4、Jetty、WAR 包、Web 开发和 XML 配置。 1. **...
- **Spring Data JDBC**:Spring Data JDBC 是一个新的模块,提供了一种轻量级的数据访问层,替代了传统的 JPA/Hibernate。 #### 三、Spring Boot 应用创建与配置 - **创建项目**: - 使用 Spring Initializr ...
2. 内嵌Web服务器:Spring Boot支持内嵌Tomcat、Jetty等Web服务器,无需额外部署,启动即可运行。 3. 快速起步:提供“spring-boot-starter”起步依赖,只需添加对应模块,即可引入所需功能。 三、Spring Boot的...
- `spring-boot-starter-data-jpa`:使用Hibernate和Spring Data JPA。 - `spring-boot-starter-data-rest`:通过Spring Data REST发布REST服务。 6. **快速创建产品就绪应用程序** Spring Boot通过以下方式加速...
hibernate3.jar spring-ibatis.jar spring-jdbc.jar spring-jdo.jar spring-jpa.jar spring-toplink.jar persistence.jar spring-aop.jar spring-agent.jar spring-tomcat-weaver.jar...
- **Spring Data JPA**:简化了对ORM框架(如Hibernate)的使用,提供了便捷的数据访问接口。 5. **Web开发** - **MVC框架**:Spring Boot内置了Spring MVC,用于构建RESTful API和Web应用。 - **Thymeleaf / ...
- **数据访问**:集成JPA、Hibernate等ORM框架,以及对NoSQL数据库的支持。 - **安全**:Spring Security提供了身份验证和授权的集成。 - **缓存**:支持EhCache、Hazelcast、Infinispan等缓存机制。 - **消息**...
8. **JPA与数据访问**:Spring Boot支持多种数据库,包括JDBC、JPA(Hibernate)、MyBatis等。自动配置包括数据源、事务管理器以及实体扫描。 9. **RESTful服务**:利用Spring MVC,Spring Boot可以轻松构建RESTful...
2. **Java EE应用服务器或Spring框架**:在Java EE环境中,如Tomcat、WildFly等应用服务器通常会自带JPA的实现。而在Spring框架中,可以通过Spring Data JPA模块方便地集成JPA。 3. **数据库驱动**:JPA虽然负责...
1. **Spring Cache Abstraction**:介绍如何使用 Spring 的缓存抽象层来简化 Ehcache 的集成过程。 2. **注解驱动**:使用注解来标记需要缓存的方法。 3. **配置管理**:通过 Spring 的配置文件或 Java 配置类来管理...
Spring5 是一个重要的版本,距离SpringFramework4差不多四年。在此期间,大多数增强都是在 SpringBoot 项目中完成的。在本文中,我们将很快了解到Spring5发行版中的一些令人兴奋的特性。 1. 基准升级 要构建和运行...