前言
在写基于Spring Boot的高并发秒杀Demo的时候,遇到了一点问题,因此记录下来。
遇到的问题
- 1.当我们在resources目录下,创建fonts文件夹,把Bootstrap所需要的glyphicons-halflings-regular.ttf、glyphicons-halflings-regular.woff、glyphicons-halflings-regular.woff2字体格式文件拷贝进来。然后我们把项目通过maven打包成war包部署到tomcat中,浏览网页的时候会出现Failed two decode downloaded font、OTS parsing error等问题。那是Maven打包复制二进制字体文件时候,没有进行过滤,因此造成二进制文件损坏。我们只需在pom进行如下配置就可以解决。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>woff</nonFilteredFileExtension>
<nonFilteredFileExtension>woff2</nonFilteredFileExtension>
<nonFilteredFileExtension>eot</nonFilteredFileExtension>
<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
<nonFilteredFileExtension>svg</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
- 2.我们在resource目录的static文件夹下面,创建css、js、fonts文件夹,分别添加所需要的资源时,然后通过mvn clean package进行打包。会发现target目录中static文件夹下面的资源没有被合理的copy进来。这主要是没有进行maven打包资源的设置,我们要复制static文件夹下面所有文件夹的资源,所以要进行如下配置。
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*</include>
<include>*/*</include>
<!--copy static文件夹下面所有-->
<include>*/**</include>
</includes>
<filtering>true</filtering>
</resource>
- 3.在业务不怎么复杂的场景下,可以适当使用存储过程。我们要在MyBatis中设置statementType为CALLABLE。一般存储过程有输入参数,返回的结果以输出参数回调出来。mode为IN说明此参数为输入参数,mode为OUT说明此参数为输出参数。例子如下所示。
<select id="killByProcedure" statementType="CALLABLE">
<![CDATA[
call execute_seckill(
#{seckillId, jdbcType=BIGINT, mode=IN},
#{phone, jdbcType=BIGINT, mode=IN},
#{killTime, jdbcType=TIMESTAMP, mode=IN},
#{result, jdbcType=INTEGER, mode=OUT}
)
]]>
</select>
- 4.我们在使用MyBatis编码代码的时候,会遇到实体类多对一关系的情况。通过2张表连接,将多对一的关系结果集映射到实体类里面,有时候会抛出No Construtor异常。这说明这个实体类中或许有Setter、getter方法,或许有有参构造器,但是可以肯定的是没有无参构造器。我们只需要在实体类中加上无参构造器,即可解决该异常。
尾言
只有不断的成长,不断的输出价值,才不会被公司扼住咽喉。
电商项目地址:https://github.com/cmazxiaoma/groupon
电商秒杀业务项目地址:https://github.com/cmazxiaoma/mallSeckill
网友评论