javascript
SpringBoot--简单处理高并发demo
目錄結(jié)構(gòu):(只跟book相關(guān)的)
model:
package com.cxb.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
//自動生成表
@Entity
@Table(name="book")
public class Book {
@Id
@GeneratedValue
private Integer id;
@Column(length=100)
private String name;
@Column(length=50)
private String author;
@Column(length=50)
private Integer stock;? ?//庫存
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
BookDao:
package com.cxb.dao;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import com.cxb.model.Book;
/**
?* springbootJPA
?*? ? ? ?這種就不需要寫service類,直接在controller里面調(diào)用該dao的方法
?* @author 81046
?*
?*/
public interface BookDao extends JpaRepository<Book, Integer>{
//And --- 等價于 SQL 中的 and 關(guān)鍵字
public List<Book> findByNameAndStock(String name,int stock);
// Or --- 等價于 SQL 中的 or 關(guān)鍵字
public List<Book> findByNameOrStock(String name,int stock);
//Between --- 等價于 SQL 中的 between 關(guān)鍵字
public List<Book> findByStockBetween(int min,int max);
//LessThan --- 等價于 SQL 中的 "<"
public List<Book> findByStockLessThan(int max);
//GreaterThan --- 等價于 SQL 中的">"??
public List<Book> findByStockGreaterThan(int min);??
//IsNull --- 等價于 SQL 中的 "is null"
public List<Book> findByNameIsNull();
//IsNotNull --- 等價于 SQL 中的 "is not null"
public List<Book> findByNameIsNotNull();??
//NotNull --- 與 IsNotNull 等價
public List<Book> findByNameNotNull();?
//Like --- 等價于 SQL 中的 "like"
public List<Book> findByNameLike(String name);?
//NotLike --- 等價于 SQL 中的 "not like"
public List<Book> findByNameNotLike(String name);?
//OrderBy --- 等價于 SQL 中的 "order by"
public List<Book> findByNameNotNullOrderByStockAsc();??
//Not --- 等價于 SQL 中的 "! ="
public List<Book> findByNameNot(String name);
//In --- 等價于 SQL 中的 "in"
public List<Book> findByNameIn(String name);
//NotIn --- 等價于 SQL 中的 "not in"
public List<Book> findByNameNotIn(String name);
//***************************************
//利用原生的sql進行操作
// @Query 注解中編寫 JPQL 語句
// 使用 @Modifying 進行修飾. 以通知 SpringData, 這是一個 UPDATE 或 DELETE 操作
@Query(value="select * from book where name = ?1 ",nativeQuery=true)
@Modifying
public List<Book> findBookByName(String name);
@Query(value="delete from book where id = ?1 ",nativeQuery=true)
@Modifying
@Transactional
public void deleteBookById(int id);
//利用原生的SQL進行修改操作??
? ?@Query(value = "update book set name=?1 where id=?2 ", nativeQuery = true)??
? ?@Modifying?
? ?@Transactional
? ?public void updateBookName(String name,int id);??
? ?
? ?//利用原生的SQL進行插入操作??
? ?@Query(value = "insert into book(name,author) value(?1,?2)", nativeQuery = true)??
? ?@Modifying??
? ?@Transactional
? ?public void insertBook(String name,String author);??
? ?
? ?//分頁查詢 查詢計算元素總個數(shù)總頁數(shù),數(shù)據(jù)多的情況下,代價是昂貴的??
? ?Page<Book> findByNameAndAuthor(String name ,String author,Pageable pageable);??
? ?
? ?//分頁查詢,返回的是一個片段,它只知道下一片段或者上一片段是否可用。??
? ?Slice<Book> findByName(String name,Pageable pageable);?
? ?
? ?//分頁查詢所有
? ?//分頁查詢 查詢計算元素總個數(shù)總頁數(shù),數(shù)據(jù)多的情況下,代價是昂貴的??
? ?Page<Book> findAll(Pageable pageable);?
? ?
? ?@Query(value = "update book set stock=stock-?1 where id=?2", nativeQuery = true)??
? ?@Modifying??
? ?@Transactional
? ?public void reduce(int num,int id);
}
BookController:
package com.cxb.controller;
import java.util.List;
import java.util.concurrent.Semaphore;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.cxb.dao.BookDao;
import com.cxb.model.Book;
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private BookDao bookDao;
//處理并發(fā)事件
//定義資源的總數(shù)量
Semaphore semaphore=new Semaphore(1);??
/** 查詢所有的圖書
?* http://localhost:8080/book/list
?* @return? ?
?*/
@RequestMapping(value="/list", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public List<Book> list() {
return bookDao.findAll();
}
/**
?* 新增圖書
?* @param request
?* @return
?*/
@RequestMapping(value="/saveBook", method=RequestMethod.POST,produces = "application/json; charset=utf-8")
@ResponseBody
public Book saveBook(HttpServletRequest request) {
String author = request.getParameter("author");
String name = request.getParameter("name");
String stock = request.getParameter("stock");
Book book = new Book();
book.setAuthor(author);
book.setName(name);
book.setStock(Integer.parseInt(stock));
return bookDao.save(book);
}
/**
?* 修改圖書
?* @param request
?* @return
?*/
@RequestMapping(value="/updateBook", method=RequestMethod.POST,produces = "application/json; charset=utf-8")
@ResponseBody
public Book updateBook(HttpServletRequest request) {
String author = request.getParameter("author");
String name = request.getParameter("name");
String stock = request.getParameter("stock");
Book book = new Book();
book.setAuthor(author);
//設(shè)置id之后,就會執(zhí)行update
book.setId(3);
book.setName(name);
book.setStock(Integer.parseInt(stock));
return bookDao.save(book);
}
/**
?* 根據(jù)id刪除圖書
?* @param request
?*/
@RequestMapping(value="/delete", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public void delete(HttpServletRequest request) {
String id = request.getParameter("id");
bookDao.deleteById(Integer.parseInt(id));
}
/** 根據(jù)庫存和名稱查詢圖書
?* http://localhost:8080/book/findByNameAndStock?name=廬州月&stock=20
?* @param request
?* @return
?*/
@RequestMapping(value="/findByNameAndStock", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public List<Book> findByNameAndStock(HttpServletRequest request) {
String name = request.getParameter("name");
String stock = request.getParameter("stock");
return bookDao.findByNameAndStock(name,Integer.parseInt(stock));
}
/** 根據(jù)名稱或者庫存查詢圖書
?* http://localhost:8080/book/findByNameOrStock?name=廬州月&stock=22
?* @param request
?* @return
?*/
@RequestMapping(value="/findByNameOrStock", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public List<Book> findByNameOrStock(HttpServletRequest request){
String name = request.getParameter("name");
String stock = request.getParameter("stock");
//滿足條件1和條件2的集合
return bookDao.findByNameOrStock(name,Integer.parseInt(stock));
}
/**
?* 根據(jù)庫存量在某個區(qū)間查詢圖書
?* @return
?*/
@RequestMapping(value="/findByStockBetween", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public List<Book> findByStockBetween(){
//滿足條件1和條件2的集合
return bookDao.findByStockBetween(10,20);
}
/** 根據(jù)名稱查詢圖書
?* http://localhost:8080/book/findBookByName?name=千百度
?* @param request
?* @return
?*/
@RequestMapping(value="/findBookByName", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public List<Book> findBookByName(HttpServletRequest request){
String name = request.getParameter("name");
return bookDao.findBookByName(name);
}
/** 根據(jù)id修改圖書的名稱
?* http://localhost:8080/book/updateBookName?name=嘆服&id=1
?* @param request
?*/
@RequestMapping(value="/updateBookName", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public void updateBookName(HttpServletRequest request) {
String name = request.getParameter("name");
String id = request.getParameter("id");
bookDao.updateBookName(name, Integer.parseInt(id));
}
/** 插入圖書
?* http://localhost:8080/book/insertBook?name=千百度1&author=許嵩
?* @param request
?*/
@RequestMapping(value="/insertBook", method=RequestMethod.POST,produces = "application/json; charset=utf-8")
@ResponseBody
public void insertBook(HttpServletRequest request) {
String name = request.getParameter("name");
String author = request.getParameter("author");
bookDao.insertBook(name, author);
}
/** 根據(jù)id刪除圖書
?* http://localhost:8080/book/deleteBookById?id=6
?* @param request? ?
?*/
@RequestMapping(value="/deleteBookById", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public void deleteBookById(HttpServletRequest request){
String id = request.getParameter("id");
bookDao.deleteById(Integer.parseInt(id));
}
/**
?* 分頁查詢圖書 根據(jù)名稱和作者
?* @param request
?* @return
?*/
@RequestMapping(value="/findByNameAndAuthor", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public Page<Book> findByNameAndAuthor(HttpServletRequest request){
@SuppressWarnings("deprecation")
//根據(jù)id降序
Pageable pageable = new PageRequest(0,3, Sort.Direction.DESC,"id");
String name = request.getParameter("name");
String author = request.getParameter("author");
return bookDao.findByNameAndAuthor(name, author, pageable);
}
/**
?* 分頁查詢所有的圖書
?* @return
?*/
@RequestMapping(value="/findAll", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public Page<Book> findAll(){
@SuppressWarnings("deprecation")
//根據(jù)id降序
Pageable pageable = new PageRequest(0,3, Sort.Direction.DESC,"id");
return bookDao.findAll(pageable);
}
/**
?*?
?* @param request
?* @return
?*/
@RequestMapping(value="/findByName", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
Slice<Book> findByName(HttpServletRequest request){
@SuppressWarnings("deprecation")
//根據(jù)id降序
Pageable pageable = new PageRequest(0,3, Sort.Direction.DESC,"id");
String name = request.getParameter("name");
return bookDao.findByName(name, pageable);
}
/**
?* 減庫存? ?處理多線程(成功幾個也會失敗幾個)
?*/
@RequestMapping(value="/reduce", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public String reduce(HttpServletRequest request){
//可用資源數(shù)
int availablePermits = semaphore.availablePermits();
System.out.println("可用資源數(shù)量---"+availablePermits);
if(availablePermits>0) {
System.out.println("搶到資源****根據(jù)id修改該圖書的庫存");
try {
//請求占用一個資源
semaphore.acquire(1);
//根據(jù)id修改該圖書的庫存
String id = request.getParameter("id");
bookDao.reduce(5, Integer.parseInt(id));
System.out.println("根據(jù)id修改該圖書的庫存完成");
}catch (Exception e) {
e.printStackTrace();
}finally {
//釋放一個資源
semaphore.release(1);
}
return "搶到資源處理業(yè)務(wù)邏輯,最后釋放資源完成";
}else {
System.out.println("*********資源已被占用,稍后再試***********");
return "*********資源已被占用,稍后再試***********";
}
}
}
SpringBootThymeleafApplication:
package com.cxb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.HttpMessageConverter;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
@SpringBootApplication
//沒有連接數(shù)據(jù)庫的時候報錯? 需要加上這一句
//@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class SpringBootThymeleafApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootThymeleafApplication.class, args);
}
/**
?* 這里是為了使用阿里的fastjson? ?方式一
?* @return
?*/
@Bean
public HttpMessageConverters fastJsonConverters() {
FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
FastJsonConfig fastConfig=new FastJsonConfig();
fastConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastConverter.setFastJsonConfig(fastConfig);
HttpMessageConverter<?> converter=fastConverter;
return new HttpMessageConverters(converter);
}
}
application.yml:
spring:
? thymeleaf:
? ? #緩沖的配置
? ? cache: false
? ? check-template: true
? ? check-template-location: true
? ? #開啟MVC thymeleaf 視圖解析
? ? enabled: true
? ? encoding: utf-8
? ? mode: HTML5
? ? prefix: classpath:/templates/
? ? suffix: .html
? ??
? ??
? #配置數(shù)據(jù)源
? datasource:
? ? ?url: jdbc:mysql://127.0.0.1:3306/sp?useUnicode=true&characterEncoding=utf8
? ? ?username: root
? ? ?password: 123456
? ? ?driver-class-name: com.mysql.jdbc.Driver
??
? jpa:
? ? hibernate:
? ? ? ddl-auto: update
? ? ??
? ? show-sql: true? ??
? ? ?
#指定mybatis映射文件的地址
mybatis:
? #配置文件的路徑
? #config-location: classpath:mybatis-config.xml
? mapper-locations: classpath:mapper/*.xml?
? # mybatis自動掃描包中的實體類,自動定義別名,別名是類名(首字母大寫或小寫都可以,一般用小寫)
? type-aliases-package: com.cxb.model
??
#pagehelper分頁插件配置
pagehelper:
? helper-dialect: mysql
? reasonable: true
? support-methods-arguments: true
? params: countSql
??
??
pom.xml
<?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>
<groupId>com.cxb</groupId>
<artifactId>SpringBoot-Thymeleaf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>SpringBoot-Thymeleaf</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--thymeleaf -->
<dependency>
? ? <groupId>org.springframework.boot</groupId>
? ? <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
? ? <groupId>org.mybatis</groupId>
? ? <artifactId>mybatis</artifactId>
? ? <version>3.4.1</version>
</dependency>
<!-- mybatis的分頁插件 -->
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency>
? ? <groupId>com.github.pagehelper</groupId>
? ? <artifactId>pagehelper-spring-boot-starter</artifactId>
? ? <version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
? ? <groupId>com.github.pagehelper</groupId>
? ? <artifactId>pagehelper</artifactId>
? ? <version>5.1.2</version>
</dependency>
<dependency>
? ? ? ? ? ? <groupId>com.alibaba</groupId>
? ? ? ? ? ? <artifactId>fastjson</artifactId>
? ? ? ? ? ? <version>1.2.15</version>
? ? ? ? </dependency>
? ? ? ??
? ? ? ? <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
? ? <groupId>junit</groupId>
? ? <artifactId>junit</artifactId>
? ? <scope>test</scope>
</dependency>
<!-- <dependency>
? ? <groupId>io.fabric8.devops.apps</groupId>
? ? <artifactId>elasticsearch</artifactId>
? ? <version>2.2.335</version>
</dependency>
?
<dependency>
? ? <groupId>org.springframework.data</groupId>
? ? <artifactId>spring-data-elasticsearch</artifactId>
</dependency>
<dependency>
? ? <groupId>net.java.dev.jna</groupId>
? ? <artifactId>jna</artifactId>
</dependency>
<dependency>
? ? <groupId>org.springframework.boot</groupId>
? ? <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
? ? <groupId>org.elasticsearch</groupId>
? ? <artifactId>securesm</artifactId>
? ? <version>1.0</version>
</dependency>
<dependency>
? ? <groupId>net.sf.jopt-simple</groupId>
? ? <artifactId>jopt-simple</artifactId>
? ? <version>3.2</version>
</dependency>
<dependency>
? ? <groupId>org.elasticsearch</groupId>
? ? <artifactId>jna</artifactId>
? ? <version>4.4.0</version>
</dependency>
<dependency>
? ? <groupId>org.apache.httpcomponents</groupId>
? ? <artifactId>httpclient</artifactId>
? ? <version>4.5.3</version>
</dependency>
<dependency>
? ? <groupId>org.apache.httpcomponents</groupId>
? ? <artifactId>httpcore</artifactId>
? ? <version>4.4.6</version>
</dependency>
<dependency>
? ? <groupId>org.apache.httpcomponents</groupId>
? ? <artifactId>httpasyncclient</artifactId>
? ? <version>4.1.2</version>
</dependency>
<dependency>
? ? <groupId>org.apache.httpcomponents</groupId>
? ? <artifactId>httpcore-nio</artifactId>
? ? <version>4.4.4</version>
</dependency>
<dependency>
? ? <groupId>commons-codec</groupId>
? ? <artifactId>commons-codec</artifactId>
? ? <version>1.10</version>
</dependency>
<dependency>
? ? <groupId>com.github.spullara.mustache.java</groupId>
? ? <artifactId>compiler</artifactId>
? ? <version>0.8.13</version>
</dependency>
<dependency>
? ? <groupId>org.locationtech.spatial4j</groupId>
? ? <artifactId>spatial4j</artifactId>
? ? <version>0.7</version>
</dependency>
<dependency>
? ? <groupId>com.vividsolutions</groupId>
? ? <artifactId>jts</artifactId>
? ? <version>1.12</version>
</dependency>
<dependency>
? ? <groupId>org.apache.lucene</groupId>
? ? <artifactId>lucene-queryparser</artifactId>
? ? <version>5.5.5</version>
</dependency>
<dependency>
? ? <groupId>org.apache.lucene</groupId>
? ? <artifactId>lucene-queries</artifactId>
? ? <version>5.2.1</version>
</dependency>
<dependency>
? ? <groupId>org.apache.lucene</groupId>
? ? <artifactId>lucene-sandbox</artifactId>
? ? <version>6.3.0</version>
</dependency>
<dependency>
? ? <groupId>org.apache.lucene</groupId>
? ? <artifactId>lucene-spatial</artifactId>
? ? <version>5.5.4</version>
</dependency>
<dependency>
? ? <groupId>org.apache.lucene</groupId>
? ? <artifactId>lucene-spatial-extras</artifactId>
? ? <version>6.3.0</version>
</dependency>
<dependency>
? ? <groupId>org.apache.lucene</groupId>
? ? <artifactId>lucene-spatial3d</artifactId>
? ? <version>7.1.0</version>
</dependency>
<dependency>
? ? <groupId>org.apache.lucene</groupId>
? ? <artifactId>lucene-suggest</artifactId>
? ? <version>6.2.1</version>
</dependency>
<dependency>
? ? <groupId>com.fasterxml.jackson.dataformat</groupId>
? ? <artifactId>jackson-dataformat-smile</artifactId>
? ? <version>2.4.4</version>
</dependency>
<dependency>
? ? <groupId>com.fasterxml.jackson.dataformat</groupId>
? ? <artifactId>jackson-dataformat-yaml</artifactId>
? ? <version>2.8.9</version>
</dependency>
<dependency>
? ? <groupId>com.fasterxml.jackson.dataformat</groupId>
? ? <artifactId>jackson-dataformat-cbor</artifactId>
? ? <version>2.8.1</version>
</dependency> -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
??
這里的測試可以用并發(fā)測試工具訪問下面的鏈接:
? 鏈接:http://localhost:8080/book/reduce
總結(jié)
以上是生活随笔為你收集整理的SpringBoot--简单处理高并发demo的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java计算机毕业设计网上拍卖系统(附源
- 下一篇: JavaScript之切换背景图片(并使