如何处理java高并发问题

如何处理并发和同步 今天讲的如何处理并发和同同步问题主要是通过锁机制。我们需要明白,锁机制有两个层面。一种是代码层次上的,如java中的同步锁,典型的就是同步关键字synchronized,这里我不在做过多的讲解,感兴趣的可以参考:http://www.cnblogs.com/xiohao/p/4151408.html 另外一种是数据库层次上...
如何处理java高并发问题
如何处理并发和同步
今天讲的如何处理并发和同同步问题主要是通过锁机制。

我们需要明白,锁机制有两个层面。

一种是代码层次上的,如java中的同步锁,典型的就是同步关键字synchronized,这里我不在做过多的讲解,

感兴趣的可以参考:http://www.cnblogs.com/xiohao/p/4151408.html

另外一种是数据库层次上的,比较典型的就是悲观锁和乐观锁。这里我们重点讲解的就是悲观锁(传统的物理锁)和乐观锁。

悲观锁(Pessimistic Locking):

悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自 外部系统的事务处理)修改持保守态度,因此,

在整个数据处理过程中,将数据处于锁定状态。

悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能 真正保证数据访问的排他性,否则,即使在本系统

中实现了加锁机制,也无法保证外部系 统不会修改数据)。

一个典型的倚赖数据库的悲观锁调用:

select * from account where name=”Erica” for update

这条 sql 语句锁定了 account 表中所有符合检索条件( name=”Erica” )的记录。

本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。
Hibernate 的悲观锁,也是基于数据库的锁机制实现。
下面的代码实现了对查询记录的加锁:

String hqlStr ="from TUser as user where user.name='Erica'";

Query query = session.createQuery(hqlStr);

query.setLockMode("user",LockMode.UPGRADE); // 加锁

List userList = query.list();// 执行查询,获取数据

query.setLockMode 对查询语句中,特定别名所对应的记录进行加锁(我们为 TUser 类指定了一个别名 “user” ),这里也就是对

返回的所有 user 记录进行加锁。

观察运行期 Hibernate 生成的 SQL 语句:
select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id
as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex
from t_user tuser0_ where (tuser0_.name='Erica' ) for update
这里 Hibernate 通过使用数据库的 for update 子句实现了悲观锁机制。
Hibernate 的加锁模式有:
Ø LockMode.NONE : 无锁机制。
Ø LockMode.WRITE : Hibernate 在 Insert 和 Update 记录的时候会自动获取
Ø LockMode.READ : Hibernate 在读取记录的时候会自动获取。
以上这三种锁机制一般由 Hibernate 内部使用,如 Hibernate 为了保证 Update
过程中对象不会被外界修改,会在 save 方法实现中自动为目标对象加上 WRITE 锁。
Ø LockMode.UPGRADE :利用数据库的 for update 子句加锁。
Ø LockMode. UPGRADE_NOWAIT : Oracle 的特定实现,利用 Oracle 的 for
update nowait 子句实现加锁。
上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:
Criteria.setLockMode
Query.setLockMode
Session.lock2017-07-23
什么方面的技术,像HTTP/SOCKET/等

然后,高并发是什么数量级

~
~2017-07-23
mengvlog 阅读 50 次 更新于 2025-09-08 06:06:38 我来答关注问题0
  • (1)动静分离。静态资源请求与动态请求分离,项目中需要访问的图片、声音、js/css等静态资源需要有独立的存放位置,便于将来实现静态请求分离时直接剥离出来,比如nginx可以直接配置图片文件直接访问目录,而不需要经过tomcat。这样tomcat就可以专注处理动态请求,操作数据库数据处理之类的。静态请求代理服务器性能...

  • 使用一般的synchronized或者是lock或者是队列都是无法满足高并发的问题。二、解决方法有三:1.使用缓存 2.使用生成静态页面 html纯静态页面是效率最高、消耗最小的页面。我们可以使用信息发布系统来实现简单的信息录入自动生成静态页面,频道管理、权限管理和自动抓取等功能,对于一个大型网站来说,拥有一套高...

  • 如何处理并发和同步 今天讲的如何处理并发和同同步问题主要是通过锁机制。我们需要明白,锁机制有两个层面。一种是代码层次上的,如java中的同步锁,典型的就是同步关键字synchronized,这里我不在做过多的讲解,感兴趣的可以参考:http://www.cnblogs.com/xiohao/p/4151408.html 另外一种是数据库层次上...

  •  深空见闻 java并发,报数据库连接超时

    解决策略如下:调整连接池参数:根据应用的实际需求,适当增加连接池的最大连接数,确保在高并发情况下有足够的连接可用。同时,合理设置连接池的超时时间,避免因为超时时间设置过短而导致的频繁超时问题。优化SQL查询:对SQL查询语句进行优化,减少查询的执行时间。例如,为经常查询的字段创建索引,避免在查询...

  •  宜美生活妙招 Java高并发缓存架构,缓存雪崩、缓存穿透之谜

    )综上所述,Java高并发缓存架构中,缓存雪崩、缓存穿透和缓存击穿是三个需要重点关注和解决的问题。通过合理的事前预防、事中处理和事后恢复策略,以及采用空值缓存、布隆过滤器、互斥锁等技术手段,可以有效地应对这些挑战,确保系统的稳定性和可靠性。

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部