1. 程式人生 > >SpringBoot--簡單處理高併發demo

SpringBoot--簡單處理高併發demo

目錄結構:(只跟book相關的)


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裡面呼叫該dao的方法
 * @author 81046
 *
 */
public interface BookDao extends JpaRepository<Book, Integer>{

//And --- 等價於 SQL 中的 and 關鍵字
public List<Book> findByNameAndStock(String name,int stock);

// Or --- 等價於 SQL 中的 or 關鍵字
public List<Book> findByNameOrStock(String name,int stock);

//Between --- 等價於 SQL 中的 between 關鍵字
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);  
   
   //分頁查詢 查詢計算元素總個數總頁數,資料多的情況下,代價是昂貴的  
   Page<Book> findByNameAndAuthor(String name ,String author,Pageable pageable);  
   
   //分頁查詢,返回的是一個片段,它只知道下一片段或者上一片段是否可用。  
   Slice<Book> findByName(String name,Pageable pageable); 
   
   //分頁查詢所有
   //分頁查詢 查詢計算元素總個數總頁數,資料多的情況下,代價是昂貴的  
   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;

//處理併發事件
//定義資源的總數量
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);
//設定id之後,就會執行update
book.setId(3);
book.setName(name);
book.setStock(Integer.parseInt(stock));
return bookDao.save(book);
}

/**
* 根據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));
}

/** 根據庫存和名稱查詢圖書
* 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));
}

/**根據名稱或者庫存查詢圖書
* 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));
}

/**
* 根據庫存量在某個區間查詢圖書
* @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);
}

/**根據名稱查詢圖書
* 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);
}

/**根據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);
}

/**根據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));
}

/**
* 分頁查詢圖書 根據名稱和作者
* @param request
* @return
*/
@RequestMapping(value="/findByNameAndAuthor", method=RequestMethod.GET,produces = "application/json; charset=utf-8")
@ResponseBody
public Page<Book> findByNameAndAuthor(HttpServletRequest request){
@SuppressWarnings("deprecation")
//根據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")
//根據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")
//根據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){
//可用資源數
int availablePermits = semaphore.availablePermits();
System.out.println("可用資源數量---"+availablePermits);
if(availablePermits>0) {
System.out.println("搶到資源****根據id修改該圖書的庫存");
try {
//請求佔用一個資源
semaphore.acquire(1);
//根據id修改該圖書的庫存
String id = request.getParameter("id");
bookDao.reduce(5, Integer.parseInt(id));
System.out.println("根據id修改該圖書的庫存完成");
}catch (Exception e) {
e.printStackTrace();
}finally {
//釋放一個資源
semaphore.release(1);
}
return "搶到資源處理業務邏輯,最後釋放資源完成";
}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
//沒有連線資料庫的時候報錯  需要加上這一句
//@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
    
    
  #配置資料來源
  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>

這裡的測試可以用併發測試工具訪問下面的連結:

  連結:http://localhost:8080/book/reduce



    

相關推薦

SpringBoot--簡單處理併發demo

目錄結構:(只跟book相關的)model:package com.cxb.model;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Gener

Redis鎖機制處理併發

文章正文   這裡我們主要利用Redis的setnx的命令來處理高併發。 setnx 有兩個引數。第一個引數表示鍵。第二個引數表示值。如果當前鍵不存在,那麼會插入當前鍵,將第二個引數做為值。返回 1。如果當前鍵存在,那麼會返回0。 建立庫存表 CREATE T

SpringBoot實現Java併發秒殺系統之併發優化

秒殺系統架構的設計和優化分析,以我一個小菜雞,目前是說不出來的o(╥﹏╥)o。 因此呢,我這裡僅從本專案已經實現的優化來介紹一下: 本專案中做到了以下優化: 秒殺介面採用md5加密方式防刷。 訂單表使用聯合主鍵方式,限制一個使用者只能購買該商品一次。 配合Spring事務

過年了,又要處理併發

涉及搶購、秒殺、抽獎、搶票等活動時,為了避免超賣,那麼庫存數量是有限的,但是如果同時下單人數超過了庫存數量,就會導致商品超賣問題。 sql1:秒殺 if(庫存數量 > 0) {   //生成訂單...  //sql2  //庫存-1 } 當

PHP 利用檔案鎖處理併發

利用 flock()函式對檔案進行加鎖(排它鎖),實現併發按序進行。 flock(file,lock,block)有三個引數。 file : 已經開啟的檔案 lock : 鎖的型別 LOCK_SH : 共享鎖定(讀鎖) LOCK_EX : 獨佔鎖定(排它鎖,寫鎖

訊息佇列處理併發

用mq來將耗時比較長或者耗費資源的請求排隊,非同步處理,減輕伺服器壓力增加穩定性。如果是高併發的實時請求,我個人覺得不適用這個方案。如果是為了高併發,我覺得應該朝解決高併發的方向考慮。叢集、分散式、動靜分離、資料庫讀寫分離之類的。web的話,只能客戶端頁面輪訓處理結果。因為,據我個人瞭解啊,現

Java處理併發量訪問的處理總結

結合之前做的一個網站,專案中分了幾個子專案,主要用到Redis,service(server)層和control層分離,有做了快取,頁面也是進行靜態化(htm和freemarker),仔細想想,整個專案基本吻合高併發,負載均衡的處理。在網上找了些資料,基本和專案的特點吻合,特別紀念一下,但是後面的一

java處理併發問題的解決發案

      隨著網際網路業務的不斷豐富,網站相關的技術經過這些年的發展,已經細分到很細的方方面面,尤其對於大型網站來說,所採用的技術更是涉及面非常廣,從硬體到軟體、程式語言、資料庫、WebServer、防火牆等各個領域都有了很高的要求,已經不是原來簡單的html靜態網站所能比

SpringBoot實現Java併發秒殺系統之Web層開發(三)

接著上一篇文章:SpringBoot實現Java高併發之Service層開發,今天我們開始講SpringBoot實現Java高併發秒殺系統之Web層開發。 Web層即Controller層,當然我們所說的都是在基於Spring框架的系統上而言的,傳統的SSH專案

SpringBoot實現Java併發秒殺系統之Service層開發(二)

繼上一篇文章:SpringBoot實現Java高併發秒殺系統之DAO層開發 我們建立了SpringBoot專案並熟悉了秒殺系統的表設計,下面我們將講解一下秒殺系統的核心部分:Service業務層的開發。 Service層又稱為業務層,在Spring階段主要是由@

SpringBoot實現Java併發秒殺系統之DAO層開發(一)

秒殺系統在如今電商專案中是很常見的,最近在學習電商專案時講到了秒殺系統的實現,於是打算使用SpringBoot框架學習一下秒殺系統(本專案基於慕課網的一套免費視訊教程:Java高併發秒殺API,視訊教程中講解的很詳細,非常感謝這位講師)。也是因為最近學習了Spr

如何處理併發情況下的DB插入

插入資料庫,在大家開發過程中是很經常的事情,假設我們有這麼一個需求: 1、我們需要接收一個外部的訂單,而這個訂單號是不允許重複的 2、資料庫對外部訂單號沒有做唯一性約束 3、外部經常插入相同的訂單,對於已經存在的訂單則拒絕處理 對於這個需求,很簡單我們會用下面的

如何處理併發

在瞭解如何處理高併發之前,我們首先了解一下分散式計算和分散式架構以及叢集   分散式計算:所謂分散式計算是一門電腦科學,它研究如何把一個需要非常巨大的計算能力才能解決的問題分成許多小的部分,然後把這些部分分配給許多計算機進行處理,最後把這些計算結果綜合起來得到最終的結果。   舉個簡單的例子:即,一個人要

java中如何處理併發情況

1.背景描述 併發就是可以使用多個執行緒同時處理不同的操作。 高併發的時候就是有很多使用者訪問,導致系統資料不正確。對於大型網站,比如入口網站。在面對大量使用者訪問,高併發請求方面,基本的解決方案集中在這樣幾個環節,使用高效能的伺服器,高效能的程式語言,還有高效能的web容

java處理併發負載類網站的優化方法

java處理高併發高負載類網站中資料庫的設計方法(java教程,java處理大量資料,java高負載資料) 一:高併發高負載類網站關注點之資料庫 沒錯,首先是資料庫,這是大多數應用所面臨的首個SPOF。尤其是Web2.0的應用,資料庫的響應是首先要解決的。 一般來說

執行緒池處理併發請求

背景 本系統(支付系統)會在每個月特定時間(如賬單日某個時間)接收上游系統發起的大量請求並進行處理,並在處理完成後返回結果給上游系統。而本系統接收到請求進行處理的過程是呼叫第三方(支付公司)進行處理並獲取結果。 系統原實現方案沒有采用任何控制請求併發數的措施,接

如何處理併發(詳細)

package com.jb.y2t034.thefifth.web.servlet;   import java.io.ByteArrayOutputStream;   import java.io.FileOutputStream;   import java.io.IOException;   impo

MySQL處理併發,防止庫存超賣庫存出現負數

mysql處理高併發的方式比較多,以下為比較簡單的一種(mysql事物控制)beginTranse();try{$result = $dbca->query('select amount from s_store where postID = 12345');if(re

處理併發、大資料儲存的網站技術架構

本文轉載自: https://zhuanlan.zhihu.com/p/24669514      大型網站技術架構剖析 高併發,大流量 40億。PV。page view。3.5億,IP。 高可用,高可用MySQL。7*24小時不間斷執行。 海量資料 使用者分佈廣泛,

如何處理併發

一個小型的網站,比如個人網站,可以使用最簡單的html靜態頁面就實現了,配合一些圖片達到美化效果,所有的頁面均存放在一個目錄下,這樣的網站對系統架構、效能的要求都很簡單,隨著網際網路業務的不斷豐富,網站相關的技術經過這些年的發展,已經細分到很細的方方面面,尤其對於大型網站來說