Spring + JPA + Hibernate + Tomcat + EHCache
来源:互联网 发布:php调用类中的方法 编辑:程序博客网 时间:2024/06/05 12:49
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 oforg.hibernate.cache.EhCacheProvider
. I was getting a WARN message if I usedorg.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>
Some of this may be redundant and will be cleaned up later.
If you have some better ideas, please do share. Thanks.
- Spring + JPA + Hibernate + Tomcat + EHCache
- jpa +hibernate+spring +ehcache config
- 如何在JPA,Hibernate 和 Spring 中配置 Ehcache 缓存
- Spring+SpringMVC+Hibernate+JPA+SpringData+Ehcache+C3p0+MySQL项目搭建
- spring+hibernate整合ehcache
- Spring+Hibernate+EHcache配置
- Spring+Hibernate+EHcache配置
- SpringMVC+Spring+Hibernate+EHCache
- spring + hibernate +ehcache配置
- Spring + hibernate + ehcache
- SPRING JPA 与 Hibernate JPA
- Spring 4.2.5 + Hibernate 4.3.11 + JPA + tomcat 集成
- Hibernate JPA 中配置Ehcache二级缓存
- Hibernate JPA 中配置Ehcache二级缓存
- Hibernate JPA 中配置Ehcache二级缓存
- struts2+spring+jpa(hibernate)
- jpa+spring+hibernate
- 11.Spring + Hibernate + JPA
- 一周实习体会
- 常用命令
- WPF/Silverlight 控件的基本组成
- http://www.cnblogs.com/dubingsky/archive/2009/07/16/1524742.html
- 关于sql server 代理(已禁用代理 xp)
- Spring + JPA + Hibernate + Tomcat + EHCache
- oracle库表修改
- 前台JS(Jquery)调用后台方法 无刷新级联菜单示例
- Refactoring: write code that humans can understand
- How many pieces of land?
- 也做个努力的妈妈:)
- JS的Slice函数
- Oracle创建用户、表空间、导入导出、...命令
- Learning XNA 3.0 第七章 第二节