spring boot 入门_SpringBoot入门建站全系列(二十)SpringDataJpa使用乐观锁与悲观锁...

news/2024/5/9 20:07:39/文章来源:https://blog.csdn.net/weixin_39523835/article/details/110510561

v2-8cc086a1e5ab9d9bcad56133113ef36e_1440w.jpg?source=172ae18b

SpringBoot入门建站全系列(二十)SpringDataJpa使用乐观锁与悲观锁

一、概述

之前有两篇《SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库CRUD》和《SpringBoot入门建站全系列(六)Spring-data-jpa进阶使用》介绍了Spring如何结合Spring-data-jpa进行数据库访问操作。这一篇介绍下springboot环境下spring-data-jpa如何进行乐观锁、悲观锁的使用。

悲观锁和乐观锁的概念:

  • 悲观锁:就是独占锁,不管读写都上锁了。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。
  • 乐观锁:不上锁,读取的时候带版本号,写入的时候带着这个版本号,如果不一致就失败,乐观锁适用于多读的应用类型,因为写多的时候会经常失败。

代码可以在Springboot组件化构建https://www.pomit.cn/java/spring/springboot.html中的JpaLock组件中查看,并下载。

首发地址: - 品茗IT-同步发布

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

二、配置

本文假设你已经引入spring-boot-starter-web。已经是个SpringBoot项目了,如果不会搭建,可以打开这篇文章看一看《SpringBoot入门建站全系列(一)项目建立》。

2.1 Maven依赖

需要引入spring-boot-starter-data-jpa,这里要访问数据库,所以要依赖数据库相关jar包。

<dependency>

2.2 配置文件

在application.properties 中需要添加下面的配置:

spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.datasource.dbcp2.max-wait-millis=60000
spring.datasource.dbcp2.min-idle=20
spring.datasource.dbcp2.initial-size=2
spring.datasource.dbcp2.validation-query=SELECT 1
spring.datasource.dbcp2.connection-properties=characterEncoding=utf8
spring.datasource.dbcp2.validation-query=SELECT 1
spring.datasource.dbcp2.test-while-idle=true
spring.datasource.dbcp2.test-on-borrow=true
spring.datasource.dbcp2.test-on-return=falsespring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=cff
spring.datasource.password=123456#JPA Configuration:  
spring.jpa.database=MySQL
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

这里面,包含了数据库连接信息、数据源的连接池配置信息、jpa配置信息。

spring.jpa.hibernate.ddl-auto属性,是对表的操作: - create 启动时删数据库中的表,然后创建,退出时不删除数据表 - create-drop 启动时删数据库中的表,然后创建,退出时删除数据表 如果表不存在报错 - update 如果启动时表格式不一致则更新表,原有数据保留 - validate 项目启动表结构进行校验 如果不一致则报错 - none 啥都不做

spring.jpa.hibernate.naming.implicit-strategy和spring.jpa.hibernate.naming.physical-strategy是对表和实体字段映射的默认处理方式。

实体名称映射到数据库中时,分成两个步骤:

  • 第一个阶段是从对象模型中提取一个合适的逻辑名称,这个逻辑名称可以由用户指定,通过@Column和@Table等注解完成,也可以通过被Hibernate的ImplicitNamingStrategy指定;
  • 第二个阶段是将上述的逻辑名称解析成物理名称,物理名称是由Hibernate中的PhysicalNamingStrategy决定;

PhysicalNamingStrategy和ImplicitNamingStrategy的区别:

  • 从处理的效果上来看,其实没有什么区别,但是从程序设计分层的角度来看,类似于MVC的分层,ImplicitNamingStrategy只管模型对象层次的处理,PhysicalNamingStrategy只管映射成真实的数据名称的处理,但是为了达到相同的效果,比如将userName映射城数据列时,在PhysicalNamingStrategy决定映射成user_name,但是在ImplicitNamingStrategy也可以做到;
  • 从处理的场景来看, 无论对象模型中是否显式地指定列名或者已经被隐式决定,PhysicalNamingStrategy都会应用; 但是对于ImplicitNamingStrategy,仅仅只有当没有显式地提供名称时才会使用,也就是说当对象模型中已经指定了@Table或者@Entity等name时,设置的ImplicitNamingStrategy并不会起作用。

所以,这里的配置,映射到表字段时,所有点都被下划线替换,骆驼情况也被下划线替换。默认情况下,所有表名都以小写生成

三、悲观锁

配置完成后,就可以拿来测试悲观锁和乐观锁了。

悲观锁在数据库的访问中使用,表现为:前一次请求没执行完,后面一个请求就一直在等待。

3.1 Dao层

数据库要实现悲观锁,就是将sql语句带上for update即可。 for update 是行锁

在Jpa的Repository这一层,直接在方法上加上@Lock(LockModeType.PESSIMISTIC_WRITE),就实现了悲观锁。

UserInfoDao :

package 

注意加上@Repository注解。实体要加上@Entity和@Table注解。

3.2 Service层

更新数据库前,先调用findByUserName方法,使用上面的配置的悲观锁锁定表记录,然后再更新。

UserInfoService :

package 

3.3 测试Web层

可以先调用/update/{time}接口,延迟执行,然后马上调用/update接口,会发现,/update接口一直在等待/update/{time}接口执行完成。

JpaPessLockRest :

package 

四、乐观锁

数据库访问dao层还是3.1那个dao。

4.1 实体添加@Version

UserInfo实体增加字段version,并添加注解@Version。当然,数据库也要加上version字段,普通字段就行,别设置成主键自增啥的。

@Version

4.2 Service层

service层我们做一下简单的调整。更新数据库前,先调用findById方法,查询出当前的版本号,然后再更新。

UserInfoService :

package 

4.2 测试Web层

可以先调用/update/{time}接口,延迟执行,然后马上调用/update接口,会发现,/update接口不会等待/update/{time}接口执行完成,读取完版本号能够成功更新数据,但是/update/{time}接口等待足够时间以后,更新的时候会报错,因为它的版本和数据库的已经不一致了。

JpaOptiLockRest :

package 

五、过程中用到的完整实体和Service

UserInfo:

UserInfoService :

详细完整的实体及代码,可以访问品茗IT-博客《SpringBoot入门建站全系列(二十)SpringDataJpa使用乐观锁与悲观锁》进行查看

品茗IT-博客专题:https://www.pomit.cn/lecture.html汇总了Spring专题、Springboot专题、SpringCloud专题、web基础配置专题。

快速构建项目

Spring组件化构建

SpringBoot组件化构建

SpringCloud服务化构建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_843209.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

woo产品页面描述追加内容_自建站产品详情页怎么设计?一文教你打造爆款产品详情页!...

点击“蓝字”关注&#xff0c;一起酷爽一夏!对于自建站卖家来说&#xff0c;Facebook广告能有效地将潜在客户吸引到你的网站。人们在社交媒体上看到有趣的产品或诱人的产品之后&#xff0c;他们经常去该网站冲动购买。但是&#xff0c;在购买产品之前&#xff0c;他们会浏览产品…

微信内访问第三方网站 聚焦input后 去除红色提醒栏

有是在微信内访问部分网站聚焦input后总是会提醒 “防欺诈盗号&#xff0c;请勿支付或输入QQ密码”&#xff0c; 而部分网站input聚焦后却没有这种提醒&#xff0c; 一直到今天&#xff0c;设置公众号的时候&#xff0c;发现了还有这样的一项 我有一个个人站点&#xff0c;备…

微信小程序 搜索优化指南(SEO)

官方 微信小程序 搜索优化指南(SEO) 值的研究一下&#xff0c; 一个好的小程序名称及头像也至关重要&#xff0c; 换了一个短的、充满关键词的小程序名称、明显的包含内容的小程序头像&#xff0c; 搜索流量明显翻倍了&#xff0c;每日访问量约100.

将网站从 ECS 转移到 webfiy,『只需要 git push,后面的事就不用操心了』

CloudBase Webify 为您的 Web 应用提供一站式托管服务&#xff0c;支持包括静态网站、动态 Web 服务各种类型的 Web 应用&#xff0c;提供默认域名、自定义域名、HTTPS、CDN 加速&#xff0c;提升 Web 应用的性能和安全性&#xff0c;此外还提供基于 Git 的工作流、DevOps 流程…

win11系统前端IIS部署发布网站步骤

目录IIS安装配置1.打开控制面板2.选择启用或关闭Windows功能3.将Internet Information Services中的三项全部选中&#xff0c;再点击确定添加网站1.开始菜单搜索 IIS&#xff0c;点击打开2.点击侧边打开目录3.点击网站——添加网站4.添加网站配置浏览网站1.选中刚才添加的网站&…

网站可以如此复制?

论坛中碰到如此问题&#xff1a;我们做了一个网站,域名是www.3322173.com 没想到今天忽然发现了www.qiepeng.cn的内容和我们的是一模一样...内容也是同步更新,只是把内容中3322173.com替换成qiepeng.cn 我关闭我自己的IIS后,两个域名都不能访问了. 我郁闷啊,这是什么样的技术哦…

RuiJi.Scraper 3.0 新增爬取链 - 深度爬取网站

RuiJi.Scraper是一款Chrome浏览器插件&#xff0c;可以可视化的对网页进行抽取&#xff0c;并导出抽取结果 本次更新添加爬取链功能&#xff0c;可以从指定页面按照规则设置对网站进行深度爬取 新功能位于新选项卡 - 爬取链 如图所示 我们以CSND搜索为例 创建爬取链 &#xf…

另类网站版式设计欣赏

另类网站版式设计欣赏 当你在创建一个新网站的时候&#xff0c;希望这些网站富有个性的版式设计能给你带来灵感。 Popmatik 这是Rob Leach设计制作的一个个人网站&#xff0c;这个网站用了一个瓶子的底图&#xff0c;网站的内容都在瓶子的这个包装纸上。 Digitalmash.com Digi…

使用Java获取一个动漫网站所有的动漫名

首先创建一个类&#xff0c;用来获取当前页面的链接&#xff1a; public class Link {private String frontStr;private String behindStr;public String linkStr;public Link(){frontStr "http://www.imomoe.ai/so.asp?page";behindStr "&dq%C8%D5%B1%…

Vue 项目(网站应用)接入QQ互联qq登录接口 汇总

还是按照顺序从头到尾介绍一下&#xff08;前面都知道的&#xff0c;可以直接看后面的VUE部分&#xff09;&#xff0c;如果有不对的地方&#xff0c;也欢迎大神指导 1、申请appid和appkey&#xff08;这指定是必须的了&#xff09; 申请地址 申请地址地址 1.1、注册开发者 1.1…

asp.net 网站源码,还原

asp.net 网站源码&#xff0c;还原1. 环境与系统2. IIS安装与配置3. 网站还原过程4. 遇到的bug备份服务器(Windows Server 2008 R2)的asp.net网站源码&#xff0c;现需仿真还原网站。 1. 环境与系统 台式计算机    Windows 7 旗舰版 2. IIS安装与配置 详见。 3. 网站还原…

奇奇seo优化软件_seo搜索优化软件产品

产品seope4c65搜索优化软件&#xff0c;5g时代的到来&#xff0c;使得很多企业对移动互联网的推广预算再次增加。究其原因&#xff0c;是移动互联网用户数量的增加&#xff0c;使得行业竞争对手增多&#xff0c;网络推广成本提高。如果预算不增加&#xff0c;企业网站的排名总是…

wordpress如何让百度快速收录_如何优化网站让百度收录我的网站?

之前有小伙伴问小编如何让自己的网站快速更好的被百度收录&#xff1f;今天黄小编就为大家讲解一下百度收录的相关知识。第一当我们做一个网站的时候&#xff0c;要检查代码里面是不是有很多出错误代码&#xff0c;或者是百度蜘蛛很不喜欢的东西。还有百度蜘蛛最不喜欢的就是网…

网站分析十必问(上)

近半年没有更新博客了&#xff0c;一是因为忙&#xff0c;二是因为懒。我觉得在工作之余能有一些自己的事情&#xff0c;并且还能把它坚持下来是一件很幸福的事情。2012年我将继 续更新我的博客。坚持写博客对我有两个好处&#xff1a;1帮助我进行思考。每一次写作的过程也是一…

企业网站服务器充值算什么费用,云服务器费应该计入什么科目

云服务器费应该计入什么科目 内容精选换一换云耀云服务器创建成功后&#xff0c;如果发现磁盘不够用或当前磁盘不满足要求&#xff0c;可以将已有云硬盘挂载给云耀云服务器&#xff0c;或在“存储 > 云硬盘”页面购买新的磁盘&#xff0c;然后再挂载至云耀云服务器。已创建可…

【码农福音】说自己英文不好而不去看英文网站的同学看过来!

作为开发者&#xff0c;都知道英文文档更全更好&#xff0c;可是对于英文不好的人来说&#xff0c;看到那密密麻麻的英文单词真头疼。 其实我们可以通过【有道网页翻译】来帮我们解决这个问题&#xff01;~操作非常简单&#xff01;一劳永逸&#xff01;~ 首先看到这是Androi…

其它网站都能正常上,就一个网站不能上的解决办法

前段时间我的电脑csdn一直都打不开&#xff0c;而同一个公司的同事却可以打开。同事还说人品问题吧&#xff01;在网上搜了解决办法都是什么奥运会期间的事&#xff0c;让我郁闷至极&#xff01; 最后终于找到问题的原因了&#xff0c;就是把浏览器的缓存清理一下&#xff01; …

程序员非常实用的十个工具网站,值得收藏

原文链接&#xff1a; 程序员非常实用的十个工具网站&#xff0c;值得收藏 一、regex101 网站地址&#xff1a; https://regex101.com/ 强大的正则表达式工具&#xff0c;你可以实时查看匹配信息&#xff0c;并且会用不同的颜色将 Group 标记出来。而且有 Quick Reference 来…

php中文网的网站怎样安装,服务器如何安装phpmyadmin

使用php和mysql开发网站的话&#xff0c;phpmyadmin是一个非常友好的mysql管理工具&#xff0c;并且免费开源&#xff0c;国内很多虚拟主机都自带这样的管理工具&#xff0c;配置很简单&#xff0c;接下来在linux服务器上配置phpmyadmin来管理MySQL数据库。首先访问phpmyadmin官…

网站解析到服务器地址,网站怎么解析到自己的云服务器地址

网站怎么解析到自己的云服务器地址 内容精选换一换本文介绍通过华为云市场镜像“Drupal内容管理系统(LAMP)”搭建Drupal网站的方法。Drupal是使用PHP语言编写的开源内容管理框架(CMF)&#xff0c;它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。Drupal用于构造提供多…