Java 高并发项目笔记

maven 配置与安装

下载maven 文件
解压之后,将文件移动到\Applications文件夹内

使用cd ~ 进入根目录文件夹 用ls -a列出文件夹内的所有文件,找到一个名称为.bash_profile的文件,打开该文件来配置环境变量

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
export MAVEN_HOME=/Applications/apache-maven-3.5.4
export PATH=$PATH:$MAVEN_HOME/bin

配置完之后 添加/调整
商家 -> 库存
<-
发货/核账source .bash_profile编译一下 然后在命令行之中用mvn - v来检查一下是否安装成功

配置环境变量
注意默认的cd ~可能不是根目录而是当前用户的目录 User\auguskong\

mvn archetype:generate -DgroupId=org.seckill -DartifactId=seckill -DarchetypeArtifactId=maven-archetype-webapp

修改servlet版本为3.1

秒杀系统业务分析

 添加(+)/调整(+/-)

商家 -> 库存
<-
发货/核账

 付款(-)/退货(+)  

用户 -> 库存
<-
秒杀/预售

秒杀业务的核心在于库存的处理

用户:

【减库存 + 记录购买明细 】
|
【完整事务】 谁 + 时间/有效期 + 付款/发货信息
|
【数据落地】

为什么需要事务? -> 事务机制依然是最可靠的数据落地方案
考虑一下情景:
减库存没有记录购买明细?
记录了购买明细但是没有减库存?
出现超卖/少买?

秒杀系统难点分析 -> 竞争
同一时间多个用户购买

事务 + 行级锁

Start Transaction
Update 库存数量
Insert 购买明细
Commit

update table set num = num - 1 where id = 10 and num > 1

数据库设计与编码

数据库路径设置
export PATH=$PATH:/usr/local/mysql/bin/

BUG!! 中英文输入法的问号意义不一样 必须使用英文的问号!!

使用 mysql -u root -p 来打开mysql面板
show create table seckill\G 查看如何创建这个表

手写DDL
记录每次上线的DDL修改
--上线V1.1
ALTER TABLE seckill
DROP INDEX idx_create_time,
add index idx_c_s(start_time, create_time);

DAO实体和接口编码

TABLE -> ENTITY 表对应java类 列对应java类当中的属性

Command + N 打开generate 可以让编译器自动生成getter 和 setter 方法

MyBatis 映射

数据库 -> 映射 -> 对象

为什么可以过滤重复? 联合主键是??
联合主键里面有电话号码,由主键不允许重复的特性保证了不存在两个相同的电话号码,可以防止一个用户重复秒杀

4-3 基于MyBatis实现DAO理论
MyBatis, Hibernate, JDBC 都是做映射的工作 对象关系映射?

MyBatis 特点

需要提供参数 + SQL(SQL必须用户来写)

SQL写在哪?

1.【推荐】XML当中
2.注解提供SQL (注解本身还是Java源码 且SQL存在拼接时很麻烦) @SQL Java 1.5之后提供
注解的缺点: 注解本质上也是Java源码,需要编译之后才能执行 复杂拼接逻辑会很复杂

如何实现DAO接口?
1.【推荐】Mapper 自动实现DAO接口 这样可以只关注于SQL接口,
2.API编程方式实现DAO接口

写三个SQL

自己控制SQL

MyBatis整合Spring的过程

目的:
使用更少的编码: 原则是只写接口,不写实现 (实现是MyBatis自动实现)
Seckill queryById(long id)
接口参数
名字代表行为
接口返回类型表示结果集
更少的配置:
* MyBatis 自动找到包名 减少了包名的代码
* 自动扫描配置文件 减去配置维护成本

保存足够的灵活性:自己定制 SQL + 自由传参

默认

DAO层单元测试编码和问题排查

import org.junit 文件包不存在的问题

//使用@Param 注解来告知MyBatis 相关参数的名字
List<Seckill> queryAll(@Param("offset") int offet, @Param("limit") int limit);

MyBatis和Spring的整合就在于配置文件的设置

 public void insertSuccessKilled() {
        long id = 1001L;
        long phone = 13421234569L;
        int insertCount = successKilledDao.insertSuccessKilled(id, phone);
        System.out.println("insertCount= " + insertCount);
    }

报错空指针异常
***

命令行命令:

ifconfig可以查看本地IP地址
MySQL 8.0当中设置密码的新语法 SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
按两次shift快速查找project当中的文件

bug log:

URL is not registered

mapper里面笔误 parameterType 改为resultType
mybatis config文件里面笔误

确定mysql的版本是和本机版本相同 进入mysql命令行之后 输入select version() 或 直接在进入时看初始加载信息

数据库连接失败可能原因:

  1. jdbc.properties 配置错误:
    1. jdbc.driver: 注意check manual确保命令正确
    2. jdbc.url:
    3. username + password
  2. 未授权远程访问或没有访问权限 需要通过SQL GRANT进行相关操作
  3. 项目未引入对应版本的驱动jar包,配置文件的设定 mysql-connector-java-5.1.6-bin.jar

因为没有设定时区而导致了bug, 这个有点扯淡了
jdbc.url=jdbc:mysql://localhost/seckill?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8

DAO层编码
编写接口
逻辑代码一行没写

有什么好处?

DAO层演变为接口设计 + SQL编写
代码和SQL的分离
DAO拼接等逻辑在Service层完成 逻辑放在Service层当中
对远程存储系统做操作的 放在DAO层


秒杀Service接口设计

站在使用者的角度设计接口
配置是一次性工作

猜你喜欢

转载自www.cnblogs.com/kong-xy/p/9880494.html