Spring框架,多用户同时访问服务端时,写起来就像只有一个人访问一样。

wow334 2024-01-17 15:27:10

流程:

用户发帖------->服务端的Controller----Service----Dao写入Mysql数据库

 

这种多用户同时发帖,mysql却不会混乱,我们普通开发者写起来就像在写只有一个用户访问数据库一样,它不错乱是因为Spirng和Mysql自己已经处理好了吗?  

 

...全文
2134 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
renkai721 01-18
  • 打赏
  • 举报
回复

首先Spring和Mysql没有任何关系,Dao层读写数据只和数据库事务有关系,提交事务数据库就保存数据,没有提交事务数据库的数据就不会发生变化。现在的spring已经很智能,都是框架自动提交事务,所以你感受不到那个过程。

然后你说【多用户同时发帖,mysql却不会混乱】这个说法是错误的,它本身是一定会混乱的。你没有发生混乱有两种原因。
第一,你的帖子主键用的是mysql自动生成的key,你可以尝试把自动生成变成普通的key,然后你通过你的Service调用Dao层的时候生成一个key【大概的逻辑就是读取数据库最后一个id,然后在规则范围内+1】,然后做insert操作。
第二,就是你点击发帖子的按钮速度太慢,并没有在1秒内提交多次。
正确的测试方法如下,
先把自动生成主键去掉,然后你需要在Controller中新写一个方法,然后开启2个多线程同时去调用你写库的那个Controller的方法,然后通过postman或者页面调用你新写的接口,你会发现它会给你报错,提示写入数据库的key重复。因为这两个方法都是在同一秒内触发的,而第一个进来的方法去数据库读取到的最后一个key和第二个进来的方法读取到的key是一样的,就是因为前面的事务还没有提交到数据库,第二个方法就进来了。

wow334 01-19
  • 举报
回复
@renkai721 谢谢!辛苦了! 多线程在访问一个方法时,我需要用sychronized来防止多线程访问时的出错。 但是java服务端,写起来却跟就只有一个用户(线程)在访问一样:多用户同时访问发帖的Controller。我并不需要做任何像sychronized一样的防护,是不是spring框架本身已经对多用户访问做了处理?
renkai721 01-22
  • 举报
回复
@wow334 以下两篇文章可以参考下 # java多线程请求同一接口,模拟高并发 https://blog.csdn.net/renkai721/article/details/102566763 # java高并发处理,限制同一接口访问次数 https://blog.csdn.net/renkai721/article/details/102566093
wow334 03-03
  • 举报
回复
@renkai721 好的,谢谢!

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧