implementation for bael-7428 (#16205)
* implementation * adding to pom.xml * ci failure --------- Co-authored-by: technoddy <mail.technoddy@gmail.com>
This commit is contained in:
parent
cc90a0b8bb
commit
7cb3519bd2
@ -91,6 +91,7 @@
|
|||||||
<module>spring-boot-redis</module>
|
<module>spring-boot-redis</module>
|
||||||
<module>spring-boot-cassandre</module>
|
<module>spring-boot-cassandre</module>
|
||||||
<module>spring-boot-react</module>
|
<module>spring-boot-react</module>
|
||||||
|
<module>spring-caching-3</module>
|
||||||
<!-- <module>spring-boot-3</module> --> <!-- JAVA-20931 -->
|
<!-- <module>spring-boot-3</module> --> <!-- JAVA-20931 -->
|
||||||
<module>spring-boot-3-grpc</module>
|
<module>spring-boot-3-grpc</module>
|
||||||
<module>spring-boot-3-native</module>
|
<module>spring-boot-3-native</module>
|
||||||
|
2
spring-boot-modules/spring-caching-3/README.md
Normal file
2
spring-boot-modules/spring-caching-3/README.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
## Relevant articles
|
||||||
|
|
44
spring-boot-modules/spring-caching-3/pom.xml
Normal file
44
spring-boot-modules/spring-caching-3/pom.xml
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>spring-caching-3</artifactId>
|
||||||
|
<version>0.1-SNAPSHOT</version>
|
||||||
|
<name>spring-caching-3</name>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>17</source>
|
||||||
|
<target>17</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung.spring-boot-modules</groupId>
|
||||||
|
<artifactId>spring-boot-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.baeldung.caching.disable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
public interface BookRepository extends JpaRepository<BookReview, Long> {
|
||||||
|
|
||||||
|
List<BookReview> findByIsbn(String isbn);
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package com.baeldung.caching.disable;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "BOOK_REVIEWS")
|
||||||
|
public class BookReview {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "book_reviews_reviews_id_seq")
|
||||||
|
@SequenceGenerator(name = "book_reviews_reviews_id_seq", sequenceName = "book_reviews_reviews_id_seq", allocationSize = 1)
|
||||||
|
private Long reviewsId;
|
||||||
|
private String userId;
|
||||||
|
private String isbn;
|
||||||
|
private String bookRating;
|
||||||
|
|
||||||
|
public Long getReviewsId() {
|
||||||
|
return reviewsId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReviewsId(Long reviewsId) {
|
||||||
|
this.reviewsId = reviewsId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserId() {
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserId(String userId) {
|
||||||
|
this.userId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIsbn() {
|
||||||
|
return isbn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsbn(String isbn) {
|
||||||
|
this.isbn = isbn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBookRating() {
|
||||||
|
return bookRating;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBookRating(String bookRating) {
|
||||||
|
this.bookRating = bookRating;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "BookReview{" + "reviewsId=" + reviewsId + ", userId='" + userId + '\'' + ", isbn='" + isbn + '\'' + ", bookRating='" + bookRating + '\'' + '}';
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o)
|
||||||
|
return true;
|
||||||
|
if (o == null || getClass() != o.getClass())
|
||||||
|
return false;
|
||||||
|
BookReview that = (BookReview) o;
|
||||||
|
return Objects.equals(reviewsId, that.reviewsId) && Objects.equals(userId, that.userId) && Objects.equals(isbn, that.isbn) && Objects.equals(bookRating, that.bookRating);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(reviewsId, userId, isbn, bookRating);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.baeldung.caching.disable;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.cache.annotation.EnableCaching;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableCaching
|
||||||
|
@EnableAutoConfiguration
|
||||||
|
public class BookReviewApplication {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(BookReviewApplication.class, args);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.baeldung.caching.disable;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.cache.CacheManager;
|
||||||
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class BookReviewsLogic {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BookRepository bookRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CacheManager cacheManager;
|
||||||
|
|
||||||
|
@Cacheable(value = "book_reviews", key = "#isbn")
|
||||||
|
public List<BookReview> getBooksByIsbn(String isbn) {
|
||||||
|
return bookRepository.findByIsbn(isbn);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.baeldung.caching.disable;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.cache.CacheManager;
|
||||||
|
import org.springframework.cache.annotation.EnableCaching;
|
||||||
|
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
|
||||||
|
import org.springframework.cache.support.NoOpCacheManager;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableCaching
|
||||||
|
public class CacheConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public CacheManager cacheManager(@Value("${appconfig.cache.enabled}") String isCacheEnabled) {
|
||||||
|
if (isCacheEnabled.equalsIgnoreCase("false")) {
|
||||||
|
return new NoOpCacheManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ConcurrentMapCacheManager();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
|
||||||
|
spring.datasource.driverClassName=org.h2.Driver
|
||||||
|
spring.datasource.username=sa
|
||||||
|
spring.datasource.password=
|
||||||
|
# Enabling H2 Console
|
||||||
|
spring.h2.console.enabled=true
|
||||||
|
spring.h2.console.path=/h2
|
||||||
|
spring.jpa.hibernate.ddl-auto=update
|
||||||
|
spring.jpa.show-sql=true
|
@ -0,0 +1,68 @@
|
|||||||
|
package com.baeldung.caching.disable;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.system.CapturedOutput;
|
||||||
|
import org.springframework.boot.test.system.OutputCaptureExtension;
|
||||||
|
import org.springframework.test.context.TestPropertySource;
|
||||||
|
|
||||||
|
@SpringBootTest(classes = BookReviewApplication.class)
|
||||||
|
@ExtendWith(OutputCaptureExtension.class)
|
||||||
|
@TestPropertySource(properties = {
|
||||||
|
"appconfig.cache.enabled=false"
|
||||||
|
})
|
||||||
|
public class BookReviewsLogicCacheDisabledUnitTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BookReviewsLogic bookReviewsLogic;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BookRepository bookRepository;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenCacheDisabled_whenLogicExecuted2ndTime_thenItQueriesDB(CapturedOutput output){
|
||||||
|
BookReview bookReview = insertBookReview();
|
||||||
|
|
||||||
|
bookReviewsLogic.getBooksByIsbn(bookReview.getIsbn());
|
||||||
|
|
||||||
|
String target = "Hibernate: select b1_0.reviews_id,"
|
||||||
|
+ "b1_0.book_rating,b1_0.isbn,b1_0.user_id "
|
||||||
|
+ "from book_reviews b1_0 "
|
||||||
|
+ "where b1_0.isbn=?";
|
||||||
|
|
||||||
|
String[] logs = output.toString()
|
||||||
|
.split("\\r?\\n");
|
||||||
|
assertThat(logs).anyMatch(e -> e.contains(target));
|
||||||
|
|
||||||
|
bookReviewsLogic.getBooksByIsbn(bookReview.getIsbn());
|
||||||
|
logs = output.toString()
|
||||||
|
.split("\\r?\\n");
|
||||||
|
|
||||||
|
long count = Arrays.stream(logs)
|
||||||
|
.filter(e -> e.contains(target))
|
||||||
|
.count();
|
||||||
|
|
||||||
|
// count 2 means the select query log from 1st and 2nd execution.
|
||||||
|
assertEquals(2, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BookReview insertBookReview() {
|
||||||
|
BookReview bookReview = new BookReview();
|
||||||
|
bookReview.setReviewsId(123L);
|
||||||
|
bookReview.setBookRating("3.2");
|
||||||
|
bookReview.setUserId("111");
|
||||||
|
bookReview.setIsbn("1234");
|
||||||
|
bookRepository.save(bookReview);
|
||||||
|
return bookReview;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
package com.baeldung.caching.disable;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.system.CapturedOutput;
|
||||||
|
import org.springframework.boot.test.system.OutputCaptureExtension;
|
||||||
|
import org.springframework.test.context.TestPropertySource;
|
||||||
|
|
||||||
|
@SpringBootTest(classes = BookReviewApplication.class)
|
||||||
|
@ExtendWith(OutputCaptureExtension.class)
|
||||||
|
public class BookReviewsLogicUnitTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BookReviewsLogic bookReviewsLogic;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BookRepository bookRepository;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenCacheEnabled_whenLogicExecuted2ndTime_thenItDoesntQueriesDB(CapturedOutput output){
|
||||||
|
BookReview bookReview = insertBookReview();
|
||||||
|
|
||||||
|
String target = "Hibernate: select b1_0.reviews_id,"
|
||||||
|
+ "b1_0.book_rating,b1_0.isbn,b1_0.user_id "
|
||||||
|
+ "from book_reviews b1_0 "
|
||||||
|
+ "where b1_0.isbn=?";
|
||||||
|
|
||||||
|
// 1st execution
|
||||||
|
bookReviewsLogic.getBooksByIsbn(bookReview.getIsbn());
|
||||||
|
String[] logs = output.toString()
|
||||||
|
.split("\\r?\\n");
|
||||||
|
assertThat(logs).anyMatch(e -> e.contains(target));
|
||||||
|
|
||||||
|
// 2nd execution
|
||||||
|
bookReviewsLogic.getBooksByIsbn(bookReview.getIsbn());
|
||||||
|
logs = output.toString()
|
||||||
|
.split("\\r?\\n");
|
||||||
|
System.out.println(logs);
|
||||||
|
long count = Arrays.stream(logs)
|
||||||
|
.filter(e -> e.equals(target))
|
||||||
|
.count();
|
||||||
|
|
||||||
|
// count 1 means the select query log from 1st execution.
|
||||||
|
assertEquals(1,count);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BookReview insertBookReview() {
|
||||||
|
BookReview bookReview = new BookReview();
|
||||||
|
bookReview.setReviewsId(123L);
|
||||||
|
bookReview.setBookRating("3.2");
|
||||||
|
bookReview.setUserId("111");
|
||||||
|
bookReview.setIsbn("1234");
|
||||||
|
bookRepository.save(bookReview);
|
||||||
|
return bookReview;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
appconfig.cache.enabled=true
|
||||||
|
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
|
||||||
|
spring.datasource.driverClassName=org.h2.Driver
|
||||||
|
spring.datasource.username=sa
|
||||||
|
spring.datasource.password=
|
||||||
|
|
||||||
|
# Enabling H2 Console
|
||||||
|
spring.h2.console.enabled=true
|
||||||
|
spring.h2.console.path=/h2
|
||||||
|
spring.jpa.hibernate.ddl-auto=update
|
||||||
|
server.port=8000
|
||||||
|
spring.jpa.show-sql=true
|
Loading…
x
Reference in New Issue
Block a user