`
dxp4598
  • 浏览: 82988 次
  • 来自: 上海
社区版块
存档分类
最新评论

转载:Spring + JPA + Hibernate + Tomcat + EHCache

阅读更多

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>
分享到:
评论

相关推荐

    java ssm内容管理系统

    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 ...

    spring+struts+hibernate+dwr+jstl做的实例

    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 ...

    CMS轻量级系统

    技术选型:Spring Data JPA、Hibernate、Shiro、 Spring MVC、Layer、MySQL 等。 简介: 1、天梯是一款使用Java编写的免费的轻量级CMS系统,目前提供了从后台管理到前端展现的整体解决方案。 2、用户可以不编写一句...

    基于Spring的注册登录系统

    该项目基于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

    EmployeeSpringMvcRest:使用spring mvc、spring data jpa、ehcache、jsp、javascript和apache tomcat进行员工数据管理。 本项目可作为学习参考

    员工SpringMvcRest 使用spring mvc、spring data jpa、ehcache、jsp、javascript和apache tomcat进行员工管理。 描述:它是一个员工管理系统,作为 Web 和休息服务暴露给用户,用户可以使用它执行基本的 crud 操作,...

    Spring Boot教程程序样例

    快速入门通常涉及创建一个新的Spring Boot项目,引入必要的起步依赖,并编写主应用类,启动内嵌的Tomcat服务器。 2. **工程配置**:Spring Boot 使用 `application.properties` 或 `application.yml` 文件进行配置...

    springboot搭建demo和spring cloud基础搭建demo

    10. **数据库支持(Database Support)**:包括JDBC、JPA(Hibernate)、MyBatis等,Spring Boot 提供了对多种数据库的开箱即用支持。 在"spring cloud基础搭建demo"中,我们将关注Spring Cloud的相关知识点: 1. ...

    spring boot 所有‘demo,打包下载’

    这个“spring boot 所有‘demo,打包下载’”的资源集合是一个极好的学习材料,涵盖了 Spring Boot 的多个关键领域,包括 JPA、Tomcat、Cache、Ant、Hibernate 4、Jetty、WAR 包、Web 开发和 XML 配置。 1. **...

    Spring boot视频

    - **Spring Data JDBC**:Spring Data JDBC 是一个新的模块,提供了一种轻量级的数据访问层,替代了传统的 JPA/Hibernate。 #### 三、Spring Boot 应用创建与配置 - **创建项目**: - 使用 Spring Initializr ...

    Javaee开发 spring boot实战

    2. 内嵌Web服务器:Spring Boot支持内嵌Tomcat、Jetty等Web服务器,无需额外部署,启动即可运行。 3. 快速起步:提供“spring-boot-starter”起步依赖,只需添加对应模块,即可引入所需功能。 三、Spring Boot的...

    spring boot35面试题

    - `spring-boot-starter-data-jpa`:使用Hibernate和Spring Data JPA。 - `spring-boot-starter-data-rest`:通过Spring Data REST发布REST服务。 6. **快速创建产品就绪应用程序** Spring Boot通过以下方式加速...

    spring-hibernate-dwr实例

    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...

    深入springboot

    - **Spring Data JPA**:简化了对ORM框架(如Hibernate)的使用,提供了便捷的数据访问接口。 5. **Web开发** - **MVC框架**:Spring Boot内置了Spring MVC,用于构建RESTful API和Web应用。 - **Thymeleaf / ...

    Spring Boot实战 ,丁雪丰 (译者)

    - **数据访问**:集成JPA、Hibernate等ORM框架,以及对NoSQL数据库的支持。 - **安全**:Spring Security提供了身份验证和授权的集成。 - **缓存**:支持EhCache、Hazelcast、Infinispan等缓存机制。 - **消息**...

    springBoot官方英文文档-2.0.2.RELEASE

    8. **JPA与数据访问**:Spring Boot支持多种数据库,包括JDBC、JPA(Hibernate)、MyBatis等。自动配置包括数据源、事务管理器以及实体扫描。 9. **RESTful服务**:利用Spring MVC,Spring Boot可以轻松构建RESTful...

    JPA开发所需jar包总结

    2. **Java EE应用服务器或Spring框架**:在Java EE环境中,如Tomcat、WildFly等应用服务器通常会自带JPA的实现。而在Spring框架中,可以通过Spring Data JPA模块方便地集成JPA。 3. **数据库驱动**:JPA虽然负责...

    ehcache官方教程

    1. **Spring Cache Abstraction**:介绍如何使用 Spring 的缓存抽象层来简化 Ehcache 的集成过程。 2. **注解驱动**:使用注解来标记需要缓存的方法。 3. **配置管理**:通过 Spring 的配置文件或 Java 配置类来管理...

    Spring_Framework_ API_5.0.5 (CHM格式)

    Spring5 是一个重要的版本,距离SpringFramework4差不多四年。在此期间,大多数增强都是在 SpringBoot 项目中完成的。在本文中,我们将很快了解到Spring5发行版中的一些令人兴奋的特性。 1. 基准升级 要构建和运行...

Global site tag (gtag.js) - Google Analytics