SpringBoot 之 接口暴露(mysql)+性能調優


一、生成

springboot選擇
  spring-boot-starter-parent -> 2.2.11.RELEASE
  java -> 1.8
  mybatis-spring-boot-starter -> 2.1.4
  mysql-connector-java -> 5.1.38

dependencies選擇
  spring web
  Mysql driver
  Mybatis Framework

二、目錄

三、代碼

application.yml

services/SaleOrderService

package com.njbdqn.sales.services;

import com.njbdqn.sales.dao.SaleOrderDAO;
import com.njbdqn.sales.entity.SalesOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class SaleOrderService {
    @Autowired
    private SaleOrderDAO sodao;

    public List<SalesOrder> mypage(int page,int size){
        Map map = new HashMap();
        map.put("rows",(page-1)*size);
        map.put("pageSize",size);
        return sodao.findDataByRow(map);
    }
}

entity/SalesOrder:實體類

public class SalesOrder {
    private int customer_sk;
    private int  product_sk;
    private String  d_date;
    private int  paynum;
    private double  paymoney;
    private int  countnum;
    private double  countmoney;
=> 這樣不好!實力類不要下划線!
=> 改成
    private int customerSk;
    private int  productSk;
    private String  dDate;
    private int  paynum;
    private double  paymoney;
    private int  countnum;
    private double  countmoney;

dao/SaleOrderDAO

package com.njbdqn.sales.dao;

import com.njbdqn.sales.entity.SalesOrder;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

public interface SaleOrderDAO {

    @Select("select customer_sk as customerSk,product_sk as productSk,paynum from dm_sales_order_count limit ${rows},${pageSize}")
    public List<SalesOrder> findDataByRow(Map map);
}

controller/SaleCtrl

package com.njbdqn.sales.controller;

import com.njbdqn.sales.entity.SalesOrder;
import com.njbdqn.sales.services.SaleOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/sale") // 模塊名
public class SaleCtrl {
    @Autowired
    private SaleOrderService sos;

    @RequestMapping("/findSaleCount") //接口名
    public List<SalesOrder> fsc(int page,int size){
        return sos.mypage(page,size);
    }
}

最外層啟動類:SalesApplication

@SpringBootApplication
@MapperScan("com.njbdqn.sales.dao")
public class SalesApplication {

    public static void main(String[] args) {
        SpringApplication.run(SalesApplication.class, args);
    }

}

注意點:

  1. 實體類不允許寫下划線!!!!!
  2. 啟動類一定是最外邊的

  3. sql語句的空格問題
  4. @RestController => 產生json到前台,適用於ajax交互場景
  5. 掃描只能掃描dao的接口 @MapperScan("com.njbdqn.sales.dao") 

四、訪問

http://localhost:8080/sale/findSaleCount?page=1&size=10

五、性能調優

測試以下接口性能,如瞬時負載測試:https://www.cnblogs.com/sabertobih/p/14105551.html

調優思路

1)連接池:使用Druid

pom中加入:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.14</version>
</dependency>

application.yml改成:

spring:
  datasource:
    druid:
      url: jdbc:mysql://192.168.56.111:3306/sales_source
      username: root
      password: root
      driver-class-name: com.mysql.jdbc.Driver
      initial-size: 20
      min-idle: 20
      max-active: 50
      max-wait: 60000
      test-on-borrow: true
      pool-prepared-statements: true
      use-global-data-source-stat: true
      connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

2)SQL語句本身調優:EXPLAIN分析執行計划

3)更改MYSQL配置 

4)MYSQL作為數據庫可能本身不合理 ——— MYSQL吞吐太慢!

  考慮換一個數據庫:

    • Redis:讀寫速度極快,性能極高,可以存JSON對象,相當於大HashMap
    • mongoDB:面向文檔存儲,吞吐量也很變態

鑒於Redis優點,

>>> 把MYSQL數據遷移到Redis上,操作見:https://www.cnblogs.com/sabertobih/p/14101970.html

>>> SpringBoot暴露接口+Redis,操作見:https://www.cnblogs.com/sabertobih/p/14106243.html

>>> 再次使用Jmeter測試工具測接口響應速度,發現速度快了10倍!!!

但Redis缺點是:無法執行復雜查詢

結合Redis優缺點的解決方案:

1)使用MYSQL做復雜查詢,結果存放在Redis中用於大量高速讀寫

2)利用Redis做物理化標准索引表,詳見:https://www.cnblogs.com/sabertobih/p/14106031.html

 

 

 

 

 

 

 

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM