每次我访问我的休息端点http://localhost:8080/byName/As
。
每次都休眠查询。 它不是在缓存数据。
我已在服务级别设置了传播REQUIRES_NEW,每次将创建新会话,但每个会话工厂都设置了2级缓存。它应该缓存数据。
我不明白为什么它不缓存数据。
pom.xml
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jcache</artifactId>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<scope>runtime</scope>
</dependency>
JCache的版本为5.4.12.Final
,EHCache的版本为3.8.1
这就是我的.properties
文件的样子
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.type=trace
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
logging.level.root=INFO
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
spring.jpa.properties.javax.persistence.sharedCache.mode=ENABLE_SELECTIVE
这是主要代码
package com.truecaller.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication
@EnableSwagger2
@EnableJpaRepositories
@EnableCaching
public class TrueCallerApplication {
public static void main(String[] args) {
SpringApplication.run(TrueCallerApplication.class, args);
}
}
REST ENDPOINT
package com.truecaller.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.truecaller.demo.exception.handler.RecordNotFoundException;
import com.truecaller.demo.models.Users;
import com.truecaller.demo.service.PhoneBookService;
@RestController
public class PhoneBookController {
private static final Logger logger = LoggerFactory.getLogger(PhoneBookController.class);
@Autowired
private PhoneBookService phoneBookService;
/**
*
* @param username
* @return List<Users>
*/
@RequestMapping(value = "/byName/{username}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public List<Users> searchByUserName(@PathVariable final String username) {
logger.info("Request Parameters {}", username);
Optional<List<Users>> user = phoneBookService.searchUserByUserName(username);
user.orElseThrow(() -> new RecordNotFoundException("No Record Found For This Particular User"));
return user.get();
}
}
电话簿服务级别
package com.truecaller.demo.service;
import java.util.List;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.truecaller.demo.dao.PhoneBookDao;
import com.truecaller.demo.models.Users;
@Service
public class PhoneBookService {
private static final Logger logger = LoggerFactory.getLogger(PhoneBookService.class);
@Autowired
private PhoneBookDao phoneBookDao;
/**
*
* @param username
* @return Optional<List<Users>>
*/
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public Optional<List<Users>> searchUserByUserName(String username) {
logger.info("Entering PhoneBook Serice Layer : searchUserByUserName() Method : Params {}", username);
return phoneBookDao.searchUserByUserName(username);
}
}
DAO层
@Repository
public class PhoneBookDao {
private static final Logger logger = LoggerFactory.getLogger(PhoneBookDao.class);
@Autowired
private PhoneBookRepository phoneBookRepository;
/**
*
* @param username
* @return List<Users>
*/
public Optional<List<Users>> searchUserByUserName(String username) {
logger.info("Entering PhoneBook DAO Layer : searchUserByUserName() Method : Params {}",username);
List<Users> users = phoneBookRepository.findByNameIgnoreCaseContaining(username);
Collections.sort(users, (user1, user2) -> {
Integer indexUser1 = user1.getName().indexOf(username);
Integer indexUser2 = user2.getName().indexOf(username);
return indexUser1.compareTo(indexUser2);
});
return Optional.of(users);
}
}
PhoneBookRepository类
@Repository
public interface PhoneBookRepository extends JpaRepository<Users, Long> {
public List<Users> findByNameIgnoreCaseContaining(String username);
}