ToB企服应用市场:ToB评测及商务社交产业平台

标题: quarkus数据库篇之四:本地缓存 [打印本页]

作者: 用户国营    时间: 2023-8-29 16:36
标题: quarkus数据库篇之四:本地缓存
欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览




源码下载

名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议
开发-创建子工程

  1.     <dependencies>
  2.         <dependency>
  3.             <groupId>io.quarkus</groupId>
  4.             <artifactId>quarkus-arc</artifactId>
  5.         </dependency>
  6.         
  7.         <dependency>
  8.             <groupId>io.quarkus</groupId>
  9.             <artifactId>quarkus-agroal</artifactId>
  10.         </dependency>
  11.         
  12.         <dependency>
  13.             <groupId>io.quarkus</groupId>
  14.             <artifactId>quarkus-hibernate-orm</artifactId>
  15.         </dependency>
  16.         
  17.         <dependency>
  18.             <groupId>io.quarkus</groupId>
  19.             <artifactId>quarkus-jdbc-postgresql</artifactId>
  20.         </dependency>
  21.         
  22.         <dependency>
  23.             <groupId>io.quarkus</groupId>
  24.             <artifactId>quarkus-junit5</artifactId>
  25.             <scope>test</scope>
  26.         </dependency>
  27.         <dependency>
  28.             <groupId>io.rest-assured</groupId>
  29.             <artifactId>rest-assured</artifactId>
  30.             <scope>test</scope>
  31.         </dependency>
  32.     </dependencies>
复制代码
开发-配置文件


  1. quarkus.datasource.db-kind=postgresql
  2. quarkus.hibernate-orm.log.sql=true
  3. quarkus.datasource.jdbc.max-size=8
  4. quarkus.datasource.jdbc.min-size=2
复制代码
  1. quarkus.datasource.username=quarkus
  2. quarkus.datasource.password=123456
  3. quarkus.datasource.jdbc.url=jdbc:postgresql://192.168.50.43:15432/quarkus_test
  4. quarkus.hibernate-orm.database.generation=drop-and-create
  5. quarkus.hibernate-orm.sql-load-script=import.sql
复制代码
  1. INSERT INTO city(id, name) VALUES (1, 'BeiJing');
  2. INSERT INTO city(id, name) VALUES (2, 'ShangHai');
  3. INSERT INTO city(id, name) VALUES (3, 'GuangZhou');
  4. INSERT INTO country(id, name) VALUES (1, 'China');
  5. INSERT INTO country_city(country_id, cities_id) VALUES (1, 1);
  6. INSERT INTO country_city(country_id, cities_id) VALUES (1, 2);
  7. INSERT INTO country_city(country_id, cities_id) VALUES (1, 3);
复制代码
基本功能概述


开发-实体类

  1. package com.bolingcavalry.db.entity;
  2. import javax.persistence.*;
  3. @Entity
  4. @Table(name = "city")
  5. @NamedQuery(name = "City.findAll", query = "SELECT c FROM City c ORDER BY c.name")
  6. public class City {
  7.     @Id
  8.     @SequenceGenerator(name = "citySequence", sequenceName = "city_id_seq", allocationSize = 1, initialValue = 10)
  9.     @GeneratedValue(generator = "citySequence")
  10.     private Integer id;
  11.     @Column(length = 40, unique = true)
  12.     private String name;
  13.     public City() {
  14.     }
  15.     public City(String name) {
  16.         this.name = name;
  17.     }
  18.     public Integer getId() {
  19.         return id;
  20.     }
  21.     public void setId(Integer id) {
  22.         this.id = id;
  23.     }
  24.     public String getName() {
  25.         return name;
  26.     }
  27.     public void setName(String name) {
  28.         this.name = name;
  29.     }
  30. }
复制代码
  1. package com.bolingcavalry.db.entity;
  2. import javax.persistence.*;
  3. import java.util.List;
  4. @Entity
  5. @Table(name = "country")
  6. public class Country {
  7.     @Id
  8.     @SequenceGenerator(name = "countrySequence", sequenceName = "country_id_seq", allocationSize = 1, initialValue = 10)
  9.     @GeneratedValue(generator = "countrySequence")
  10.     private Integer id;
  11.     @Column(length = 40, unique = true)
  12.     private String name;
  13.     @OneToMany
  14.     List<City> cities;
  15.     public Country() {
  16.     }
  17.     public Country(String name) {
  18.         this.name = name;
  19.     }
  20.     public Integer getId() {
  21.         return id;
  22.     }
  23.     public void setId(Integer id) {
  24.         this.id = id;
  25.     }
  26.     public String getName() {
  27.         return name;
  28.     }
  29.     public void setName(String name) {
  30.         this.name = name;
  31.     }
  32.     public List<City> getCities() {
  33.         return cities;
  34.     }
  35.     public void setCities(List<City> cities) {
  36.         this.cities = cities;
  37.     }
  38. }
复制代码
开发-服务类

  1. @ApplicationScoped
  2. public class CityService {
  3.     @Inject
  4.     EntityManager entityManager;
  5.     public City getSingle(Integer id) {
  6.         return entityManager.find(City.class, id);
  7.     }
  8.     public List<City> get() {
  9.         return entityManager.createNamedQuery("City.findAll", City.class)
  10.                 .getResultList();
  11.     }
  12.     @Transactional
  13.     public void create(City fruit) {
  14.         entityManager.persist(fruit);
  15.     }
  16.     @Transactional
  17.     public void update(Integer id, City fruit) {
  18.         City entity = entityManager.find(City.class, id);
  19.         if (null!=entity) {
  20.             entity.setName(fruit.getName());
  21.         }
  22.     }
  23.     @Transactional
  24.     public void delete(Integer id) {
  25.         City entity = entityManager.getReference(City.class, id);
  26.         if (null!=entity) {
  27.             entityManager.remove(entity);
  28.         }
  29.     }
  30. }
复制代码
  1. @ApplicationScoped
  2. public class CountyService {
  3.     @Inject
  4.     EntityManager entityManager;
  5.     public Country getSingle(Integer id) {
  6.         return entityManager.find(Country.class, id);
  7.     }
  8. }
复制代码
开发-单元测试

  1. @QuarkusTest
  2. @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
  3. public class CacheTest {
  4.     /**
  5.      * import.sql中导入的记录数量,这些是应用启动是导入的
  6.      */
  7.     private static final int EXIST_CITY_RECORDS_SIZE = 3;
  8.     private static final int EXIST_COUNTRY_RECORDS_SIZE = 1;
  9.     /**
  10.      * 在City.java中,id字段的SequenceGenerator指定了initialValue等于10,
  11.      * 表示自增ID从10开始
  12.      */
  13.     private static final int ID_SEQUENCE_INIT_VALUE = 10;
  14.     /**
  15.      * import.sql中,第一条记录的id
  16.      */
  17.     private static final int EXIST_FIRST_ID = 1;
  18.     @Inject
  19.     CityService cityService;
  20.     @Inject
  21.     CountyService countyService;
  22.     @Test
  23.     @DisplayName("list")
  24.     @Order(1)
  25.     public void testGet() {
  26.         List<City> list = cityService.get();
  27.         // 判定非空
  28.         Assertions.assertNotNull(list);
  29.         // import.sql中新增3条记录
  30.         Assertions.assertEquals(EXIST_CITY_RECORDS_SIZE, list.size());
  31.     }
  32.     @Test
  33.     @DisplayName("getSingle")
  34.     @Order(2)
  35.     public void testGetSingle() {
  36.         City city = cityService.getSingle(EXIST_FIRST_ID);
  37.         // 判定非空
  38.         Assertions.assertNotNull(city);
  39.         // import.sql中的第一条记录
  40.         Assertions.assertEquals("BeiJing", city.getName());
  41.     }
  42.     @Test
  43.     @DisplayName("update")
  44.     @Order(3)
  45.     public void testUpdate() {
  46.         String newName = LocalDateTime.now().toString();
  47.         cityService.update(EXIST_FIRST_ID, new City(newName));
  48.         // 从数据库取出的对象,其名称应该等于修改的名称
  49.         Assertions.assertEquals(newName, cityService.getSingle(EXIST_FIRST_ID).getName());
  50.     }
  51.     @Test
  52.     @DisplayName("create")
  53.     @Order(4)
  54.     public void testCreate() {
  55.         int numBeforeDelete = cityService.get().size();
  56.         City city = new City("ShenZhen");
  57.         cityService.create(city);
  58.         // 由于是第一次新增,所以ID应该等于自增ID的起始值
  59.         Assertions.assertEquals(ID_SEQUENCE_INIT_VALUE, city.getId());
  60.         // 记录总数应该等于已有记录数+1
  61.         Assertions.assertEquals(numBeforeDelete + 1, cityService.get().size());
  62.     }
  63.     @Test
  64.     @DisplayName("delete")
  65.     @Order(5)
  66.     public void testDelete() {
  67.         // 先记删除前的总数
  68.         int numBeforeDelete = cityService.get().size();
  69.         // 删除testCreate方法中新增的记录,此记录的是第一次使用自增主键,所以id等于自增主键的起始id
  70.         cityService.delete(ID_SEQUENCE_INIT_VALUE);
  71.         // 记录数应该应该等于删除前的数量减一
  72.         Assertions.assertEquals(numBeforeDelete-1, cityService.get().size());
  73.     }
  74. }
复制代码

实体类缓存

  1.     @DisplayName("cacheEntity")
  2.     @Order(6)
  3.     @RepeatedTest(10000)
  4.     public void testCacheEntity() {
  5.         City city = cityService.getSingle(EXIST_FIRST_ID);
  6.         // 判定非空
  7.         Assertions.assertNotNull(city);
  8.     }
复制代码




SQL查询结果缓存


  1.     @DisplayName("cacheSQL")
  2.     @Order(7)
  3.     @RepeatedTest(10000)
  4.     public void testCacheSQL() {
  5.         List<City> cities = cityService.get();
  6.         // 判定非空
  7.         Assertions.assertNotNull(cities);
  8.         // import.sql中新增3条city记录
  9.         Assertions.assertEquals(EXIST_CITY_RECORDS_SIZE, cities.size());
  10.     }
复制代码



  1. Query query = ...
  2. query.setHint("org.hibernate.cacheable", Boolean.TRUE);
复制代码
一对多关联查询缓存


  1.     @DisplayName("cacheOne2Many")
  2.     @Order(8)
  3.     @RepeatedTest(10000)
  4.     public void testCacheOne2Many() {
  5.         Country country = countyService.getSingle(EXIST_FIRST_ID);
  6.         // 判定非空
  7.         Assertions.assertNotNull(country);
  8.         // import.sql中新增3条city记录
  9.         Assertions.assertEquals(EXIST_CITY_RECORDS_SIZE, country.getCities().size());
  10.     }
复制代码



重要提示

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4