SpringBoot AOP 和 事务
SpringBoot 整合 AOP
动态代理技术
JDK 动态代理
- JDK 动态代理是 Java 自带的一种代理方式。它要求目标类必须有接口,基于这个接口,JDK 在运行时会动态生成一个代理对象。这个代理对象和目标对象就像 “拜把子” 的兄弟,因为它们都实现了相同的接口,能以相同的方式被调用,只是代理对象在调用真正的方法前后可以添加额外的逻辑。
.CGLIB 动态代理
- CGLIB 动态代理是另一种代理技术。它的厉害之处在于不需要目标类有接口,通过让代理类继承目标类来实现代理,就好比代理类 “认” 目标类为 “干爹”。这样,代理类就能在目标类方法调用的前后插入自己的逻辑,从而对目标类的行为进行增强。
Spring AoP
AoP 概述
AOP 核心概念
- 切入点:实际被 AOP 控制的方法,需要被增强的方法
- 通知:封装共享功能的方法就是通知
AoP 通知类型
环绕就是一部分在目标方法之前,一部分在之后
- 它的返回值代表的是原始方法执行完毕的返回值
try {前置通知 @Before目标方法执行返回后通知 @AfterReturning
} catch() {异常后通知 @AfterThrowing
} finally {后置通知 @After
}
AoP 通知顺序
AoP 切点表达式 @execution
AoP 切点表达式重用
第一种:创建存储切点的类维护
创建一个存储切点的类
单独维护切点表达式
execution 使用:类全限定符.方法名()
- 切点维护类
@Component
public class MyPointCut {@Pointcut("execution(* com.atguigu.service.impl.*.*(..))")public void pc(){}
- 重用类演示类
@Before("com.atguigu.pointcut.MyPointCut.pc()")public void start() {System.out.println("方法开始了");}@After("com.atguigu.pointcut.MyPointCut.pc()")public void after() {System.out.println("方法结束了");}@AfterThrowing("com.atguigu.pointcut.MyPointCut.pc()")public void error() {System.out.println("方法报错了");}
第二种:当前类中提取表达式
定义一个空方法
注解 @Pointcut()
增强注解中引用切点 直接调用方法名
@Aspect
@Component
public class UserServiceAspect {// 定义一个空方法,使用@Pointcut注解来定义切点表达式,这里表示匹配UserService接口下的所有方法@Pointcut("execution(* com.example.demo.service.UserService.*(..))")public void userServicePointcut() {}// 在前置通知中复用上面定义的切点表达式,直接写切点方法名即可@Before("userServicePointcut()")public void beforeAddUser() {System.out.println("在执行UserService的方法前执行的逻辑");}
AoP 基本使用
底层技术组成
动态代理(InvocationHandler):
JDK原生
的实现方式,需要被代理的目标类必须实现接口。因为这个技术要求代理对象和目标对象实现同样的接口(兄弟两个拜把子模式)。cglib
:通过继承被代理的目标类(认干爹模式)实现代理,所以不需要目标类实现接口。AspectJ
:SpringAOP借用了AspectJ中的AOP注解。也就是说@Before
等注解都来自 AspectJ
默认代理方式演示(JDK原生)
第一步:导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
第二步:准备接口和实现类
public interface Calculator {int add(int i, int j);
}
@Component
public class CalculatorPureImpl implements Calculator {@Overridepublic int add(int i, int j) {int result = i + j;return result;}
}
第三步:声明切面类 @Aspect
切面类要加入 IoC 容器
并且要使用@Aspect
声明为切面类
@Aspect
@Component
public class LogAdvice {@Pointcut("execution(* com.mangfu.Calculator.*(..))")public void Mypointcut(){}@Before("Mypointcut()")public void testBefore() {System.out.println("before");}@AfterReturning("Mypointcut()")public void testAfterReturning() {System.out.println("afterReturning");}@AfterThrowing("Mypointcut()")public void testAfterThrowing() {System.out.println("afterThrowing");}@After("Mypointcut()")public void testAfter() {System.out.println("after");}
}
环绕通知
就相当于直接进入切面类执行
- 接口和实现类
public interface Calculator {int add(int i, int j);
}
@Component
public class CalculatorPureImpl implements Calculator {@Overridepublic int add(int i, int j) {int result = i + j;return result;}
}
- 配置类开启 AspectJ
@Configuration
@ComponentScan("com.mangfu")
@EnableAspectJAutoProxy
public class MyConfig {
}
- 切面类
ProceedingJoinPoint joinPoint
:目标方法对象jointPoint.getArgs()
: 获取目标方法运行的参数joinPoint.proceed(args)
: 执行目标方法
@Aspect
@Component
public class LogAdvice {@Around("execution(* com.mangfu.Calculator.*(..))")public Object around(ProceedingJoinPoint joinPoint) {Object[] args = joinPoint.getArgs(); //获取目标方法运行的参数Object result = null; //用于接收目标参数的返回值try {System.out.println("Before");result = joinPoint.proceed(args); //调用目标方法System.out.println("AfterReturning");} catch (Throwable e) {System.out.println("Afterthrowing");throw new RuntimeException(e);} finally {System.out.println("After");}return result;}
}
- 测试类
@SpringJUnitConfig(MyConfig.class)
public class MyTest {@Autowiredprivate Calculator calculator;@Testpublic void test() {System.out.println(calculator.add(1, 2));}
}
JoinPoint 详解
CGLib 动态代理生效情况
在目标类没有实现任何接口的情况下,Spring会自动使用cglib技术实现代理。
- 如果目标类有接口, 选择使用
jdk
动态代理:实现目标接口
- 如果目标类没有接口, 选择
cglib
动态代理:继承目标对象
- 如果有接口, 就用接口接值
- 如果没有接口, 就用类进行接值
- 没实现接口的实体类和切面类
@Component
public class Calculator {public int add(int i, int j) {int result = i + j;return result;}
}
@Aspect
@Component
public class testBefore {@Before("execution(* com.mangfu2.Calculator.add(..))" )public void before(){System.out.println("test sucessful");}
}
- 测试类
@SpringJUnitConfig(MyConfig.class)
public class MyTest {//建议用接口取。防止后期取不到代理类对象//正常:aop - aop底层选择代理 - 选择jdk代理 - 根据接口生成代理类 - 代理对象和目标对象 是拜把子 兄弟关系。不是同一个//这里实现类没有实现接口所以用 CGLib 动态代理//aop - ioc 容器中真正存储的是代理对象不是目标对象@Autowiredprivate Calculator calculator;@Testpublic void test(){calculator.add(1,2);}}
Spring AoP 对获取 Bean 的影响
JDK 原生代理
声明一个接口,其仅有一个实现类,同时创建切面类对该接口的实现类应用通知:
- 按接口类型获取 bean 可正常获取。
- 按类获取 bean 则无法获取,原因在于应用切面后,实际存放在 IOC 容器中的是代理类对象,目标类本身并未放入 IOC 容器,所以依据目标类类型无法从 IOC 容器中找到相应对象
CGLib 代理
声明一个类,创建一个切面类,对上面的类应用通知
- 根据类获取 bean,能获取到
Spring TX 声明式事务
声明式事务概念
定义
:通过注解或 XML 配置的方式控制事务的提交和回滚,具体事务实现由第三方框架负责,开发者只需添加相应配置,无需直接进行事务操作。优点
:可将事务控制和业务逻辑分离,提升代码的可读性与可维护性。
spring-tx
: 包含声明式事务实现的基本规范(事务管理器规范接口和事务增强等等)spring-jdbc
: 包含DataSource方式事务管理器实现类DataSourceTransactionManagerspring-orm
: 包含其他持久层框架的事务管理器实现类例如:Hibernate/Jpa等
.
spring-tx
就是 Spring 官方提供的事务接口,各大持久层框架需要自己实现这个接口,而spring-jdbc
就是jdbc
,jdbcTemplate
,mybatis
的实现类DataSourceTranscationManager
。spring-orm
就是Hibernate/Jpa
等持久层框架的实现类
声明式事务基本使用
SpringBoot
项目会自动配置一个DataSourceTransactionManager
,所以我们只需在方法(或者类)加上@Transactional
注解,就自动纳入Spring
的事务管理了
第一步:加入依赖
jdbc, jdbcTemplate, mybatis
这三个持久层框架情况
<!-- 第三方实现 spring 事务接口的类的依赖-->
<!-- spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.0.6</version></dependency>
- 如果是
Hibernate
等其他持久层框架就用spring-jdbc
换成spring-orm
依赖
第二步:给需要事务的地方加上 @Transactional
注解
@Treanscational
加在类上就是类里所有方法开启事务。加在方法上就单独那个方法有事务
- Dao层
@Repository
public class StudentDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public void updateNameById(String name,Integer id){String sql = "update students set name = ? where id = ? ;";int rows = jdbcTemplate.update(sql, name, id);}public void updateAgeById(Integer age,Integer id){String sql = "update students set age = ? where id = ? ;";jdbcTemplate.update(sql,age,id);}
}
- Service 层
@Service
public class StudentService {@Autowiredprivate StudentDao studentDao;/*** 添加事务:* @Transctional* 位置: 方法 | 类上* 方法: 当前方法有事务* 类上: 泪下所有方法都有事务*///这里有自动事务了。所以可以报错可以自动回滚@Transactionalpublic void changeInfo(){studentDao.updateAgeById(88,1);int i = 1/0;System.out.println("-----------");studentDao.updateNameById("test1",1);}
}
- 测试类
@SpringJUnitConfig(JavaConfig.class)
public class TxTest {@Autowired private StudentService studentService;@Testpublic void testTx(){studentService.changeInfo();}
}
事务的属性
事务属性:只读
只读模式可以提升查询事务的效率!,一般情况都是通过类添加注解添加事务,类下的所有方法都有事务,而查询方法一般不用添加事务。这个时候可以再次添加事务注解,设置为只读,提高效率查询效率
@Transactional(readOnly = ...)
@Transactional
@Service
public class StudentService {@Autowiredprivate StudentDao studentDao;//查询 没有必要添加事务。这里设置为只读提高效率@Transactional(readOnly = true)public void getStudentInfo() {//获取学生信息 查询数据库 不修改}}
事务属性:超时
事务在执行过程中,有可能因为遇到某些问题,导致程序卡住,从而长时间占用数据库资源。而长时间占用资源,大概率是因为程序运行出现了问题(可能是Java程序或MySQL数据库或网络连接等等)。此时这个很可能出问题的程序应该被回滚,撤销它已做的操作,事务结束,把资源让出来,让其他正常程序可以执行。概括来说就是一句话:超时回滚,释放资源。
@Transactional(timeout = ...)
@Transactional(timeout = 3)
@Service
public class StudentService {@Autowiredprivate StudentDao studentDao;public void changeInfo() {studentDao.updateAgeById(88,1);System.out.println("-----------");try {Thread.sleep(4000);} catch (InterruptedException e) {throw new RuntimeException(e);}studentDao.updateNameById("test2",1);}//因为这个注解会覆盖掉类上注解。所以要再设置一遍@Transactional(readOnly = true, timeout = 3)public void getStudentInfo() {}}
事务属性:回滚
默认情况下,发生运行时 (RuntimeException) 异常事务才回滚,所以我们可以指定 Exception 异常来控制所有异常都回滚
roollbackFor = 回滚的异常范围
:设置的异常都回滚noRollbackFor = 不回滚的异常范围
:控制某个异常不回滚
//所有异常都回滚,除了 FileNotFoundException
@Transactional(rollbackFor = Exception.class, noRollbackFor = FileNotFoundException.class)public void changeInfo() throws FileNotFoundException {studentDao.updateAgeById(99,1);new FileInputStream("xxxx");studentDao.updateNameById("test2",1);}
事务属性:事务隔离级别
事务并发可能引发的问题
脏读
:一个事务读取另一个事务未提交的数据不可重复读
:一个事务就是读取了另一个事务提交的修改数据幻读
: 一个事务读取了另一个事务提交的插入数据
事务隔离级别
读未提交(Read Uncommitted)
:事务可以读取未被提交的数据,容易产生脏读、不可重复读和幻读等问题。实现简单但不太安全,一般不用。读已提交(Read Committed)
:事务只能读取已经提交的数据,可以避免脏读问题,但可能引发不可重复读和幻读。可重复读(Repeatable Read)
:在一个事务中,相同的查询将返回相同的结果集,不管其他事务对数据做了什么修改。可以避免脏读和不可重复读,但仍有幻读的问题。串行化(Serializable)
:最高的隔离级别,完全禁止了并发,只允许一个事务执行完毕之后才能执行另一个事务。可以避免以上所有问题,但效率较低,不适用于高并发场景。
.不同的隔离级别适用于不同的场景,需要根据实际业务需求进行选择和调整。
建议设置第二个隔离级别
isolation = Isolation.事务的隔离级别
READ_UNCOMMITTED 读未提交
READ_COMMITTED 读已提交
REPEATABLE_READ 可重复读
SERIALIZABLE 串行化
//设置事务隔离级别为可串行化
@Transactional(isolation = Isolation.SERIALIZABLE)public void changeInfo() throws FileNotFoundException {studentDao.updateAgeById(99,1);new FileInputStream("xxxx");studentDao.updateNameById("test2",1);}
事务属性:事务传播行为
propagation = 传播规则
【默认是 Propagation.REQUIRED】
我们一般使用默认就行
名称【传播规则】 | 含义 |
---|---|
REQUIRED | 如果父方法有事务,就加入,如果没有就新建自己独立!父方法有事务报错,子方法会回滚 |
REQUIRES_NEW | 不管父方法是否有事务,我都新建事务,都是独立的!即使父方法有有事务报错。两个子方法也不会回滚 |
就是用父方法
topService()
调用 子方法changeAge()
和changeName()
。这两个子方法是否会进行回滚
相关文章:
SpringBoot AOP 和 事务
SpringBoot 整合 AOP 动态代理技术 JDK 动态代理 JDK 动态代理是 Java 自带的一种代理方式。它要求目标类必须有接口,基于这个接口,JDK 在运行时会动态生成一个代理对象。这个代理对象和目标对象就像 “拜把子” 的兄弟,因为它们都实现了相同…...
如何使用Python调用大语言模型的API接口?
以下是使用 Python 调用几种常见大语言模型 API 接口的详细步骤和示例代码: 1. 调用 OpenAI 的 GPT 模型 API OpenAI 提供了强大的 GPT 系列模型,使用其 API 需要先注册 OpenAI 账号并获取 API 密钥。 步骤: 安装openai库:pip…...
如何监控ubuntu系统某个程序的运行状态,如果程序出现异常,对其自动重启。
在Ubuntu系统中,可以通过编写脚本结合cron或systemd来监控程序的运行状态,并在程序异常时自动重启。以下是具体步骤: 方法一:使用Shell脚本和Cron 编写监控脚本 创建一个Shell脚本来检查程序是否运行,并在程序异常时重…...
Kafka 压缩算法详细介绍
文章目录 一 、Kafka 压缩算法概述二、Kafka 压缩的作用2.1 降低网络带宽消耗2.2 提高 Kafka 生产者和消费者吞吐量2.3 减少 Kafka 磁盘存储占用2.4 减少 Kafka Broker 负载2.5 降低跨数据中心同步成本 三、Kafka 压缩的原理3.1 Kafka 压缩的基本原理3.2. Kafka 压缩的工作流程…...
启元世界(Inspir.ai)技术浅析(二):深度强化学习
深度强化学习(Deep Reinforcement Learning, DRL)是启元世界在人工智能领域的一项核心技术,广泛应用于游戏AI、智能决策等领域。 一、状态(State) 1.1 概念与作用 **状态(State)**是指智能体对环境的感知,是智能体进行决策的基础。在深度强化学习中,状态通常是一个高…...
在K8s中部署动态nfs存储provisioner
背景 之前,我已经在一台worker node上安装了local lvm 的provisioner来模拟需要本地高IOPS的数据库等stafeful应用的实现。 为了后续给虚拟机里的K8s集群安装可用的metrics和logs监控系统(metrics和logs的时序数据库需要永久存储)࿰…...
SQL注入漏洞之绕过[前端 服务端 waf]限制 以及 防御手法 一篇文章给你搞定
目录 绕过手法 前端代码绕过 后端代码绕过 各种字段进行验证 union 大小写绕过 双写逃过 强制类型判断 引号特殊编码处理。 内联注释绕过 注释符绕过 or/and绕过 空格绕过 防御SQL注入的方法 使用预编译语句 使用存储过程 检查数据类型 绕过手法 前端代码绕过…...
C++ 写一个简单的加减法计算器
************* C topic:结构 ************* Structure is a very intersting issue. I really dont like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits. Like building a house. Wh…...
Effective C++ 规则50:了解 new 和 delete 的合理替换时机
1、背景 在 C 中,new 和 delete 是动态分配内存的核心操作符。然而,直接使用它们有时会增加程序的复杂性,甚至导致内存泄漏和其他问题。因此,了解何时替换 new 和 delete 并选择更适合的内存管理策略,是编写高效、健壮…...
水果实体店品牌数字化:RWA + 智能体落地方案
一、方案背景 随着数字化技术的迅猛发展,实体零售行业正面临前所未有的挑战与机遇。传统的零售模式难以满足消费者对个性化、便捷化、智能化的需求,尤其是在水果等生鲜商品领域,如何通过技术手段提升运营效率、增强顾客体验、拓宽盈利模式&a…...
Docker小游戏 | 使用Docker部署FC-web游戏模拟器
Docker小游戏 | 使用Docker部署FC-web游戏模拟器 前言一、项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署FC-web游戏模拟器下载镜像创建容器检查容器状态检查服务端口安全设置四、访问FC-web游戏模拟器试玩游戏FC游戏的操作方法…...
【视频+图文详解】HTML基础3-html常用标签
图文教程 html常用标签 常用标签 1. 文档结构 <!DOCTYPE html>:声明HTML文档类型。<html>:定义HTML文档的根元素。<head>:定义文档头部,包含元数据。<title>:设置网页标题,浏览…...
年化19.3%策略集|ctpbee_api替换成openctp整合backtrader实盘方案(代码+数据)
原创内容第782篇,专注量化投资、个人成长与财富自由。 昨天我们把backtraderctpbee的实盘整合代码跑通了,年化19.3%,回撤仅8%的实盘策略,以及backtrader整合CTPBee做实盘(附python代码和数据) 这两周我们加…...
谭浩强C语言程序设计(3) 7章
1、递归实现N的阶乘 c复制 #include <cstdio> // 包含标准输入输出库// 计算n的阶乘 int total 0; // 定义全局变量total用于存储阶乘结果// 递归函数计算阶乘 int fac(int a){// 如果输入的数小于0,输出错误信息if (a < 0){printf("%d < 0,err…...
国产SiC碳化硅功率器件技术成为服务器电源升级的核心引擎
在服务器电源应用中,国产650V碳化硅(SiC)MOSFET逐步取代传统超结(Super Junction, SJ)MOSFET,其核心驱动力源于SiC材料在效率、功率密度、可靠性和长期经济性上的显著优势,叠加产业链成熟与政策…...
深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据
深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据 一、服务器如何响应前端请求 前端与后端的交互主要通过 HTTP 协议实现。以下是详细步骤: 1. 前端发起 HTTP 请求 GET 请求:用于从服务器获取数据。POST 请求:用…...
深度学习指标可视化案例
TensorBoard 代码案例:from torch.utils.tensorboard import SummaryWriter import torch import torchvision from torchvision import datasets, transforms# 设置TensorBoard日志路径 writer SummaryWriter(runs/mnist)# 加载数据集 transform transforms.Comp…...
unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等
目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景,仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…...
网易云音乐歌名可视化:词云生成与GitHub-Pages部署实践
引言 本文将基于前一篇爬取的网易云音乐数据, 利用Python的wordcloud、matplotlib等库, 对歌名数据进行深入的词云可视化分析. 我们将探索不同random_state对词云布局的影响, 并详细介绍如何将生成的词云图部署到GitHub Pages, 实现数据可视化的在线展示. 介绍了如何从原始数据…...
Web-3.0(Solidity)基础教程
Solidity 是 以太坊智能合约编程语言,用于编写 去中心化应用(DApp)。如果你想开发 Web3.0 应用,Solidity 是必学的。 Remix - Ethereum IDE(在线编写 Solidity) 特性Remix IDEHardhat适用场景适合 初学者 …...
android获取EditText内容,TextWatcher按条件触发
android获取EditText内容,TextWatcher按条件触发 背景:解决方案:效果: 背景: 最近在尝试用原生安卓实现仿element-ui表单校验功能,其中涉及到EditText组件内容的动态校验,初步实现功能后&#…...
题单:冒泡排序1
题目描述 给定 n 个元素的数组(下标从 1 开始计),请使用冒泡排序对其进行排序(升序)。 请输出每一次冒泡过程后数组的状态。 要求:每次从第一个元素开始,将最大的元素冒泡至最后。 输入格式…...
我的毕设之路:(2)系统类型的论文写法
一般先进行毕设的设计与实现,再在现成毕设基础上进行描述形成文档,那么论文也就成形了。 1 需求分析:毕业设计根据开题报告和要求进行需求分析和功能确定,区分贴合主题的主要功能和拓展功能能,删除偏离无关紧要的功能…...
JVM_类的加载、链接、初始化、卸载、主动使用、被动使用
①. 说说类加载分几步? ①. 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 第一过程的加载(loading)也称为装载验证、准备、解析3个部分统称为链接(Linking)在Java中数据类型分为基本数据类型和引用数据…...
数论问题79一一研究成果
(豆包智能搜索一一李扩继) 李扩继是一位在数学研究尤其是哥德巴赫猜想研究领域有一定成果的中学老师,以下是关于他的具体介绍: ①研究经历:2006年承担咸阳市教研室的立项课题《角谷猜想的研究》,虽未完成角谷猜想的证明ÿ…...
【DeepSeek-V3】AI Model Evaluation Framework and index schedule AI模型能力评价指标及对比
文章目录 AI 模型评估体系 | AI Model Evaluation Framework1. 模型架构信息 | Model Architecture Information2. 英语能力评估 | English Language Proficiency3. 编程能力评估 | Programming Capability Metrics4. 数学能力评估 | Mathematical Capability Assessment5. 中文…...
《程序人生》工作2年感悟
一些杂七杂八的感悟: 1.把事做好比什么都重要, 先树立量良好的形象,再横向发展。 2.职场就是人情世故,但也不要被人情世故绑架。 3.要常怀感恩的心,要记住帮助过你的人,愿意和你分享的人,有能力…...
Elasticsearch的开发工具(Dev Tools)
目录 说明1. **Console**2. **Search Profiler**3. **Grok Debugger**4. **Painless Lab**总结 说明 Elasticsearch的开发工具(Dev Tools)在Kibana中提供了多种功能强大的工具,用于调试、优化和测试Elasticsearch查询和脚本。以下是关于Cons…...
22_解析XML配置文件_List列表
解析XML文件 需要先 1.【加载XML文件】 而 【加载XML】文件有两种方式 【第一种 —— 使用Unity资源系统加载文件】 TextAsset xml Resources.Load<TextAsset>(filePath); XmlDocument doc new XmlDocument(); doc.LoadXml(xml.text); 【第二种 —— 在C#文件IO…...
智慧园区管理平台实现智能整合提升企业运营模式与管理效率
内容概要 在当今数字化的背景下,智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术,旨在通过智能整合各类资源与信息,帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…...
从规则到神经网络:机器翻译技术的演进与未来展望
从规则到神经网络:机器翻译技术的演进与未来展望 引言 还记得早些年用翻译软件翻译一句简单的英文句子,却发现翻译结果让人啼笑皆非的日子吗?从“我喜欢吃苹果”被翻译成“我喜欢吃苹果电脑”,到今天的神经网络机器翻译(Neural Machine Translation, NMT)能够生成语义流…...
[MySQL]事务的隔离级别原理与底层实现
目录 1.为什么要有隔离性 2.事务的隔离级别 读未提交 读提交 可重复读 串行化 3.演示事务隔离级别的操作 查看与设置事务的隔离级别 演示读提交操作 演示可重复读操作 1.为什么要有隔离性 在真正的业务场景下,MySQL服务在同一时间一定会有大量的客户端进程…...
hdfs:介绍三个脚本
1、jps-cluster.sh 如果我们想在Bigdata01 这台电脑上,查看整个集群的服务启动情况,可以使用这个脚本文件。 #!/bin/bash USAGE"使⽤⽅法:sh jps-cluster.sh" NODES("bigdata01" "bigdata02" "bigdata03…...
【Oracle篇】使用Hint对优化器的执行计划进行干预(含单表、多表、查询块、声明四大类Hint干预)
💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…...
【Rust自学】15.7. 循环引用导致内存泄漏
说句题外话,这篇文章真心很难,有看不懂可以在评论区问,我会尽快作答的。 喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω…...
4.scala默认参数值
Scala具备给参数提供默认值的能力,这样调用者就可以忽略这些具有默认值的参数。 def log(message: String, level: String "INFO") println(s"$level: $message")log("System starting") // prints INFO: System starting log(&q…...
前端知识速记—JS篇:null 与 undefined
前端知识速记—JS篇:null 与 undefined 什么是 null 和 undefined? 1. undefined 的含义 undefined 是 JavaScript 中默认的值,表示某个变量已被声明但尚未被赋值。当尝试访问一个未初始化的变量、函数没有返回值时,都会得到 u…...
微信小程序中常见的 跳转方式 及其特点的表格总结(wx.navigateTo 适合需要返回上一页的场景)
文章目录 详细说明总结wx.navigateTo 的特点为什么 wx.navigateTo 最常用?其他跳转方式的使用频率总结 以下是微信小程序中常见的跳转方式及其特点的表格总结: 跳转方式API 方法特点适用场景wx.navigateTowx.navigateTo({ url: 路径 })保留当前页面&…...
【人工智能】基于Python的机器翻译系统,从RNN到Transformer的演进与实现
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 机器翻译(Machine Translation, MT)作为自然语言处理领域的重要应用之一,近年来受到了广泛的关注。在本篇文章中,我们将详细探讨如何使…...
蓝桥备赛指南(5)
queue队列 queue是一种先进先出的数据结构。它提供了一组函数来操作和访问元素,但它的功能相对较简单,queue函数的内部实现了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素。 queue函数的常用函数 1.push()函数:…...
蓝桥云客 好数
0好数 - 蓝桥云课 问题描述 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位…)上的数字是奇数,偶数位(十位、千位、十万位…)上的数字是偶数,我们就称之为“好数”。 给定一个正…...
CF 764B.Timofey and cubes(Java实现)
题目分析 输入n个数字,首尾交换,奇数对换,偶数对不换 思路分析 存入数组,遍历时判断i%20时(数组下标0开始,所以题目分析没有错),对换 代码 import java.util.*;public class Main {public static void ma…...
四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)
四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用) 文章目录 四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)2.hash 哈希表常用指令(详细讲解说明)2.1 hset …...
AIGC(生成式AI)试用 20 -- deepseek 初识
>> 基本概念 Ollama -- 运行大模型,管理运行AI大模型的工具,用来安装布置DeepSeek https://ollama.com/ , Get up and running with large language models. AnythingLLM -- 大模型增强应用,GUI大模型交互程序 Download AnythingLLM …...
你好!这是我自己的CSDN博客!
写于2025年1月30日 我是一个普通的嵌入式软件程序员,喜欢研究Linux(应用层跟内核从都有粗浅的涉略),单片机,操作系统和计算机体系架构等内容,目前是一枚普通的本科生。 笔者是一个朴素的开源主义者…...
将pandas.core.series.Series类型的小数转化成百分数
大年初二,大家过年好,蛇年行大运! 今天在编写一个代码的时候,使用 import pandas as pd产生了pandas.core.series.Series类型的数据,里面有小数,样式如下: 目的:将这些小数转化为百…...
[EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型
Paper Card 论文标题:RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation 论文作者:Songming Liu, Lingxuan Wu, Bangguo Li, Hengkai Tan, Huayu Chen, Zhengyi Wang, Ke Xu, Hang Su, Jun Zhu 论文链接:https://arxiv.org/ab…...
oracle中使用in 和 not in 查询效率分析
在Oracle数据库中,IN和NOT IN的查询效率受多种因素影响,以下是关键点总结和优化建议: 1. IN 的效率 优化方式: IN 通常会被优化为 OR条件 或 半连接(Semi-Join),如果子查询关联到外部表&#x…...
【python】四帧差法实现运动目标检测
四帧差法是一种运动目标检测技术,它通过比较连续四帧图像之间的差异来检测运动物体。这种方法可以在一定的程度上提高检测的准确性。 目录 1 方案 2 实践 ① 代码 ② 效果图 1 方案 具体的步骤如下: ① 读取视频流:使用cv2.VideoCapture…...
指针的介绍4【回调函数、qsort函数的运用】
1.回调函数 1.1定义 回调函数就是通过函数指针而被调用的函数 把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数 回调函数不是由该函数的实现⽅直接调⽤࿰…...