关于java高并发问题总结

关于java高并发问题总结

文章是参考了很多优秀博客的内容,算作自己的一个心得笔记

java代码层面来控制多线程并发的问题

这一部分在学习java基础时就已经了解,主要是围绕着synchronized关键字来对公共资源进行锁定,或是利用java提供的Lock机制来处理。
这些都依赖主要的业务逻辑来决定选择何种方式处理

利用ORM对数据库层面来控制并发问题

数据库本身有乐观锁和悲观锁的概念,一般来说,ORM的悲观锁一般是依靠数据库本身的机制来实现。例如按照锁的范围来分,就可以分为表级锁和行级锁:
表级锁,就是指当处理这个sql的时候,整个表都只能处理这一条语句,当别的线程想要对本张表进行操作时,会被阻止,直到这条语句处理结束,并且commit或者roll back以后,其他线程才能对此表进行别的操作。然而行级锁的概念与其对应,指的是操作时,数据库对当前进行加锁,例如只读锁或者共享锁。

然而乐观锁的实现,主要思路则是通过依赖数据库表的设计实现的,例如在表中添加指定的version字段。查询时对本字段不做处理,但更新时version会加1,这样可以保证多线程处理的安全性(具体原因不详细叙述)。
例如,hibernate中会有version标签,来设置version字段,然后再处理业务逻辑时自动进行锁的处理。一般是会在ormapping中加入<*hibernate-mapping>
<*class name=”com.xxxxxx.xxxx.xxx” optimistic-lock=”version” table=”T_Xxxx” schema=”STOCK”>来设置乐观锁

大数据量下的其他问题,表查询效率问题
当没有数据库集群时,主要的解决思路还是对表的一个拆分:
拆分一般包括水平拆分和垂直拆分,垂直拆分主要设计,单表拆多表,选取属性,适当冗余,来提高数据库设计合理性和查询效率。水平拆分时:不同情况一般会选取不同的方法,但主要目的还是要保证拆分成的单表量差异不大。

当然,表拆分后我们的应用得做相应的适配。单纯的or-mapping也许就得改动了。比如部分业务得通过存储过程等 。

缓存
当用户量大时,做缓存处理是必不可少的,很直观来说,缓存可以减少用户对数据库的访问量,直接减少服务器的压力。
hibernate ORM有提供一级二级缓存机制,而且目前也有专业的缓存框架,来部署缓存服务器。

最后,理解高并发的瓶颈
1、可能是服务器网络带宽不够
2.可能web线程连接数不够
3.可能数据库连接查询上不去

对应的解决方法:

1.增加网络带宽,DNS域名解析分发多台服务器。
2.负载均衡,前置代理服务器nginx、apache等等
3.数据库查询优化,读写分离,分表等等

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值