项目开发遇到的问题

性能优化方面

1)数据库连接太多,导致连接失效和崩溃
1.show processlist
可以通过show processlist来查看当前的mysql连接,处于sleep状态的线程正在等待客户端发送新的请求,处于空闲状态,可以通过kill命令关闭这些线程,释放数据库连接。
2 max_connections
可以增加全局变量max_connections,mysql允许的最大用户连接数,设置此值的一个参考方法是查看全局状态变量Max_used_connections,数据库过去的最大连接数,一般数据库的最大连接数应该占到数据库允许的最大连接数的10%以上。
3 wait_timeout
另外一个可以调整的参数是wait_timeout,数据库断开一个非交互式连接前所要等待的秒数,这个值过大了会造成MySQL里面大量的sleep线程无法释放。但是过小了也不好,可能会遇到MySQL has gone away之类的问题。
对于wait_timeout的值设定,应该根据系统的运行情况来判断。在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,可以进行适当的调整小些。

2)数据加载太慢
发现了每次读取的时候hibernate会把所有对象中的数据都取出来,然而我往往只需要其中的一个或者几个,开启hibernate的懒加载。
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能

3)登陆查询较慢
seesion做缓存,redis

错误修改方面

4)序列化和反序列化问题
在前后端分离的Web项目中,前端用的是Ant Designer,后端用Spring MVC。要求后端实体对象序列化为Json数据时忽略掉某属性,而在前端发送Json数据到后端反序列化为实体对象时不忽略掉该属性。

@ManyToOne 和 @OneToMany

对于具有一对多关系的两个实体订单表Order和订单条目表OrderItem,一个order会有很多的orderItem,而在OrderItem中会有属性order引用order id,多个订单条目对应一个订单,通过@ManyToOne映射数据库的外键关系:
在这里插入图片描述
在这里插入图片描述
而我们使用了通过@OneToMany映射数据库一对多关系:Order中会有属性items引用多个订单条目,导致了循环引用的发生
在这里插入图片描述
@JsonIgnre
当前端向后端请求订单或订单条目的详情信息时,后端将实体对象序列化为Json数据传给前端,因为Order和OrderItem之间有循环引用关系,所以序列化时会报错,前端无法获取数据。

解决办法便是打破循环引用,可以使用@JsonIgnore使Order实体序列化为Json数据时,忽略掉items属性,这里从开发习惯上一般忽略一对多的关系,获取订单条目另写接口。而多对一关系则不需要忽略,可以在返回订单条目信息时直接返回对应订单信息。

JsonIgnore属性可以使用在属性或Getter方法上,使Java对象序列化为Json数据时忽略此属性。

采用以上方法,可以解决前端获取后端数据的问题,但对于另一个需求,创建订单接口,前端按照后端订单实体的格式包装Json数据传给后端,反序列化为Java对象,再保存到数据库中。订单条目信息保存在订单Json数据的items属性中,但在使用@JsonIgnore后反序列化时该属性也会被忽略,导致后端无法获取前端Json数据的items属性值。

@JsonProperty
后来经过查询,我们发现可以采用如下方法解决:

在Getter方法上使用@JsonIgnore属性,使Java对象序列化时忽略掉该属性,不传给前端;
在Setter方法上使用JsonProperty属性,使Json数据反序列化为Java对象时不忽略该属性,正常获取该属性值。
修改后的代码如下
在这里插入图片描述
5.多减库存超卖的问题
用postman进行测试下单接口的时候,发生过下单100次,结果减了不到一百次的问题,检查代码没有问题,单步调试没有问题,所以估计是发生了并发时的操作问题,因为mysql的默认隔离级别是Repeatable read 重复读,所以在第一个接口读数据的时候,第二个线程虽然不能改数据,但却可以将数据读出来,然后第一个将库存减一,写回以后,第二个线程将库存减一写回,导致了卖了2缺减了一个的超卖问题的发生,然后使用了select for update 直接锁住了那行记录不让别人修改,就不出错了,但这样我在疯狂下单时候,查询库存会变慢,因为直接锁死了,后来采用了cas思想,读inbound,然后改的时候写update set ……where inbound = val,就可以了

6.nginx的跨域问题

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值