大数据下高并发的处理详解.docx

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
大数据下高并发的处理详解.docx

大数据下高并发的处理详解本文章来自于阿里云云栖社区对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了。而并发问题是绝大部分的程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就要想想应对措施,今天我们就一起讨论一下常见的并发和同步吧。首先为了更好的理解并发和同步,我们需要首先明白两个重要的概念:同步和异步同步和异步的区别和联系所谓同步,就是一个线程执行一个方法或函数的时候,会阻塞其它线程,其他线程要等待它执行完毕才能继续执行。异步,就是多个线程之间没有阻塞,多个线程同时执行。通俗一点来说,同步就是一件事一件事的做,异步就是做一件事,不影响做其他事情。例如:吃饭和说话,只能一件一件的来,因为只有一张嘴。但是吃饭和听音乐是异步的,可以一起进行,因为听音乐并不影响我们吃饭。对于Java程序员来说,Synchronized最为熟悉了,如果它作用于一个类的话,那么就是一个线程访问类的方法时,其他线程就会阻塞,相反,如果没有这个关键字来修饰的话,不同线程就可以在同一时间访问同一个方法,这就是异步。脏读和不可重复读脏读脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这是,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读取的这个数据是脏数据(Dirty Data),依据脏数据所做的操作可能是不正确的。不可重复读在第一个事务读取数据后,第二个事务对数据进行了修改,导致第一个事务结束前再访问这个数据的时候,会发现两次读取到的数据是不一样的,因此称为不可重复读。如何处理并发和同步今天讲的如何处理并发和同同步问题主要是通过锁机制。我们需要明白,锁机制有两个层面。一种是代码层次上的,如果Java中的同步锁Synchronized,另一种是数据库层次上的,比较典型的就是悲观锁(传统的物理锁)和乐观锁悲观锁悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。因此,在这个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。一个典型的倚赖数据库的悲观锁调用:select * fromaccountwherename=”Erica” forupdate这条 sql 语句锁定了 account 表中所有符合检索条件( name=”Erica” )的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。Hibernate 的悲观锁,也是基于数据库的锁机制实现。下面的代码实现了对查询记录的加锁:1234String hqlStr =from TUser as user where user.name=Erica;Queryquery = session.createQuery(hqlStr);query.setLockMode(user,LockMode.UPGRADE); // 加锁ListuserList = query.list();// 执行查询,获取数据观察运行期 Hibernate 生成的 SQL 语句:1select tuser0_.idasid, tuser0_.nameasname, tuser0_.group_idasgroup_id, tuser0_.user_type asuser_type, tuser0_.sex as sex fromt_user tuser0_ where (tuser0_.name=Erica ) forupdate这里 Hibernate 通过使用数据库的 for update 子句实现了悲观锁机制。Hibernate 的加锁模式有:123456789101112LockMode.NONE:无锁机制。LockMode.WRITE: Hibernate 在Insert和Update记录的时候会自动获取LockMode.READ: Hibernate 在读取记录的时候会自动获取。以上这三种锁机制一般由 Hibernate 内部使用,如 Hibernate 为了保证Update过程中对象不会被外界修改,会在save方法实现中自动为目标对象加上 WRITE 锁。LockMode.UPGRADE:利用数据库的forupdate子句加锁。LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的forupdatenowait子句实现加锁。上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:Criteria.setLockM

文档评论(0)

tangtianxu1 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档