做秒杀项目遇到的坑
问题一
在springboot的2.0.6版本下的controller层,使用@Controller无法通过的到templates模版页面
解决办法
清空本地maven仓库里的.m2下的所有包,重新下载一遍包,出现了包冲突
问题二
在springboot中使用redis并连接使用时,出现java.util.NoSuchElementException: Timeout waiting for idle object的报错
在这块代码
@Bean //通过这种方式将JedisPool注入到Spring容器中
public JedisPool jedisPoolFactory(){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(redisConfig.getMaxIdle());
jedisPoolConfig.setMaxTotal(redisConfig.getMaxActive());
jedisPoolConfig.setMaxWaitMillis(redisConfig.getMaxWait()*1000);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisConfig.getHost(), redisConfig.getPort(), redisConfig.getTimeout()*1000,redisConfig.getPassword(),0);
return jedisPool;
}
如果将这行代码改成jedisPoolConfig.setMaxTotal(8);可获得redis中的,不会出现上述的报错,所以断定是
jedisPoolConfig.setMaxTotal(redisConfig.getMaxActive());这行没有生效,即没有注入
解决办法,每一个变量用@Value注入
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.timeout}")
private int timeout;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.jedis.pool.max-active}")
private int maxActive;
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.jedis.pool.max-wait}")
private int maxWait;
问题三
在项目中,会出现一个用户对一个商品秒杀时,同时请求了两次,导致数据库压力增大,并且库存不会按标准减
解决办法:因为有miaoshaorder表里面有userId和goodsId表示,所以数据库使用联合索引,这样同一个用户对相同商品连续请求两次时,插入数据库失败
问题四
用tomcat部署,将miaosha.war放到tomcat下的webapps文件下面。
开启tomcat,在bin目录下执行
./startop.sh //开启tomcat
若关闭tomcat,执行
./shutdown.sh //关闭tomcat
开启后访问主页需要加上miaosha前缀,比如
我原本访问主页是 http://localhost:8080/login/to_login
但是在tomcat下是 http://localhost:8080/miaosha/login/to_login
而且在tomcat这种部署情况下,有些资源加在不出来,因为有些资源访问不需要miaosha这一前缀
解决方法:
打开conf文件下的server.xml文件,在
<Context docBase="miaosha" path="/" debug="0" privileged="true"></Context>
path=”” 为war路径,docBase=””为你的war的文件名