春季靴子|二级缓存不起作用埃凯

时间:2020-05-10 01:00:26

标签: java hibernate spring-boot jpa ehcache-3

每次我访问我的休息端点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);

}

0 个答案:

没有答案