Skip to content

Commit

Permalink
#376 added caching to improve load times when loading matrix
Browse files Browse the repository at this point in the history
  • Loading branch information
Peglow-C authored and KlausRicharz committed Jul 19, 2024
1 parent dd32c99 commit 509963f
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 2 deletions.
16 changes: 16 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,22 @@
<version>0.2.0</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-jcache -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-jcache</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ehcache/ehcache -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.tb.common.configuration;

import org.hibernate.cache.jcache.ConfigSettings;

import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.jcache.JCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.cache.CacheManager;
import javax.cache.Caching;
import javax.cache.spi.CachingProvider;

@Configuration(proxyBeanMethods = false)
@EnableCaching
public class HibernateSecondLevelCacheConfiguration {

@Bean
public JCacheCacheManager cacheManager() {
CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();
return new JCacheCacheManager(cacheManager);
}

@Bean
public HibernatePropertiesCustomizer hibernateSecondLevelCacheCustomizer(JCacheCacheManager cacheManager) {
return (properties) -> properties.put(ConfigSettings.CACHE_MANAGER, cacheManager.getCacheManager());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,40 @@
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

import jakarta.persistence.QueryHint;
import org.hibernate.jpa.HibernateHints;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.QueryHints;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import org.tb.dailyreport.domain.Timereport;

@Repository
public interface TimereportRepository extends CrudRepository<Timereport, Long>, JpaSpecificationExecutor<Timereport> {

@QueryHints(value = {
@QueryHint(name = HibernateHints.HINT_CACHEABLE, value = "true"),
@QueryHint(name = HibernateHints.HINT_CACHE_REGION, value = "TimereportRepository.findAllByEmployeecontractIdAndReferencedayRefdate")
}
)
List<Timereport> findAllByEmployeecontractIdAndReferencedayRefdate(long employeecontractId, LocalDate refDate);

List<Timereport> findAllByEmployeecontractIdAndReferencedayRefdateIsGreaterThanEqual(long employeecontractId, LocalDate refDate);

List<Timereport> findAllByEmployeecontractIdAndStatusAndReferencedayRefdateIsLessThanEqual(long employeecontractId, String status, LocalDate date);

@QueryHints(value = {
@QueryHint(name = HibernateHints.HINT_CACHEABLE, value = "true"),
@QueryHint(name = HibernateHints.HINT_CACHE_REGION, value = "TimereportRepository.findAllByEmployeecontractIdAndReferencedayBetween")
}
)
@Query("""
select t from Timereport t
where t.employeecontract.id = :employeecontractId and
t.referenceday.refdate >= :begin and t.referenceday.refdate <= :end
where t.employeecontract.id = :employeecontractId
and t.referenceday.refdate >= :begin
and t.referenceday.refdate <= :end
order by t.employeecontract.employee.sign asc,
t.referenceday.refdate asc,
t.employeeorder.suborder.customerorder.sign asc,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,22 @@
import java.util.List;
import java.util.Optional;

import jakarta.persistence.QueryHint;
import org.hibernate.jpa.HibernateHints;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.QueryHints;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import org.tb.dailyreport.domain.Workingday;

@Repository
public interface WorkingdayRepository extends CrudRepository<Workingday, Long> {

@QueryHints(value = {
@QueryHint(name = HibernateHints.HINT_CACHEABLE, value = "true"),
@QueryHint(name = HibernateHints.HINT_CACHE_REGION, value = "WorkingdayRepository.findByRefdayAndEmployeecontractId")
}
)
Optional<Workingday> findByRefdayAndEmployeecontractId(LocalDate refday, long employeecontractId);

List<Workingday> findAllByEmployeecontractId(long employeeContractId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

import jakarta.persistence.QueryHint;
import org.hibernate.jpa.HibernateHints;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.QueryHints;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
Expand All @@ -17,6 +21,11 @@ public interface EmployeecontractRepository extends PagingAndSortingRepository<E
@Query("select e from Employeecontract e where e.employee.id = :employeeId and e.validFrom <= :validAt and (e.validUntil >= :validAt or e.validUntil is null)")
Optional<Employeecontract> findByEmployeeIdAndValidAt(long employeeId, LocalDate validAt);

@QueryHints(value = {
@QueryHint(name = HibernateHints.HINT_CACHEABLE, value = "true"),
@QueryHint(name = HibernateHints.HINT_CACHE_REGION, value = "EmployeecontractRepository.findAllValidAtAndNotHidden")
}
)
@Query("""
select e from Employeecontract e where (e.hide = false or e.hide is null)
or (e.validFrom <= :date and (e.validUntil >= :date or e.validUntil is null))
Expand Down
8 changes: 8 additions & 0 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ spring:
hibernate:
format_sql: true
show_sql: false
use_sql_comments: true
#optional - generate statistics to check if L2/query cache is actually being used.
generate_statistics: false
cache:
use_second_level_cache: true
use_query_cache: true
region:
factory_class: org.hibernate.cache.jcache.JCacheRegionFactory

hibernate:
naming:
Expand Down

0 comments on commit 509963f

Please sign in to comment.