Spring-事务2
文章目录
- 前言
- 一、事务的特性(ACID)
- 二、事务的隔离级别
- 三、spring中的事务
- 平台事务管理器.
- 事务定义
- ISOLation_XXX:**事务隔离级别.**
- PROPAGATION_XXX:**事务的传播行为**.
- 事务状态
- 关系:
- 四、使用XML文件配置事务
- 1、 搭建环境
- 2、 配置及业务编写
- 3、 测试
- 五、使用注解形式进行事务开发
- 总结
前言
事务是逻辑上的一组操作的集合,要么全部成功,要么全部失败。在实际的业务场景中,事务的应用场景范围很广泛,例如转账,订单,支付等
一、事务的特性(ACID)
事务有四大特性:
- 原子性:事务不可分割
- 一致性:事务执行的前后,数据完整性保持一致.
- 隔离性:一个事务执行的时候,不应该受到其他事务的打扰
- 持久性:一旦结束,数据就永久的保存到数据库.
二、事务的隔离级别
在实际的开发中,可能会出现以下几种由数据操作引起的异常情况:
如果不考虑隔离性:
- 脏读:一个事务读到另一个事务未提交数据
- 不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事务多次查询结果不一致
- 虚读:一个事务读到另一个事务已经提交数据(insert)导致一个事务多次查询结果不一致
事务存在几种隔离级别:
- 未提交读:以上情况都有可能发生。
- 已提交读:避免脏读,但不可重复读,虚读是有可能发生。
- 可重复读:避免脏读,不可重复读,但是虚读有可能发生。
- 串行化:避免以上所有情况.
三、spring中的事务
后端分层开发中,事务应用于Service层中。spring提供了事务管理API
平台事务管理器.
PlatformTransactionManager
- getTransaction(TransactionDefinition definition) :开启事务
- rollback(TransactionStatus status) :回滚事务
- commit(TransactionStatus status) :提交事务
Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现
使用Spring JDBC或iBatis 进行持久化数据时使用(重点)
- org.springframework.jdbc.datasource.DataSourceTransactionManager
使用Hibernate进行持久化数据时使用
- org.springframework.orm.hibernate.HibernateTransactionManager
使用JPA进行持久化时使用
- org.springframework.orm.jpa.JpaTransactionManager
当持久化机制是Jdo时使用
- org.springframework.jdo.JdoTransactionManager
使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用
- org.springframework.transaction.jta.JtaTransactionManager
事务定义
TransactionDefinition
ISOLation_XXX:事务隔离级别.
ISOLATION_DEFAULT:默认级别. Mysql --> repeatable_read | Oracle -->> read_commited
级别如下:
- ISOLATION_READ_UNCOMMITTED : 读未提交
- ISOLATION_READ_COMMITTED : 读已提交
- ISOLATION_REPEATABLE_READ :可重复读
- ISOLATION_SERIALIZABLE :串行化
PROPAGATION_XXX:事务的传播行为.
事务的传播行为是用来解决实际开发中的问题
传播行为是指:解决业务层调用事务的关系。
- PROPAGATION_REQUIRED: 支持当前事务,如果不存在 就新建一个
A,B 如果A有事务,B使用A的事务,如果A没有事务,B就开启一个新的事务.(A,B是在一个事务中。)
- PROPAGATION_SUPPORTS: 支持当前事务,如果不存在,就不使用事务
A,B 如果A有事务,B使用A的事务,如果A没有事务,B就不使用事务.
- PROPAGATION_MANDATORY: 支持当前事务,如果不存在,抛出异常
A,B 如果A有事务,B使用A的事务,如果A没有事务,抛出异常.
- PROPAGATION_REQUIRES_NEW: 如果有事务存在,挂起当前事务,创建一个新的事务
A,B 如果A有事务,B将A的事务挂起,重新创建一个新的事务.(A,B不在一个事务中.事务互不影响.)
- PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果有事务存在,挂起当前事务
A,B 非事务的方式运行,A有事务,就会挂起当前的事务.
-
PROPAGATION_NEVER: 以非事务方式运行,如果有事务存在,抛出异常
-
PROPAGATION_NESTED: 如果当前事务存在,则嵌套事务执行
基于SavePoint技术.
A,B A有事务,A执行之后,将A事务执行之后的内容保存到SavePoint.B事务有异常的话,用户需要自己设置事务提交还是回滚.
- 常用:(重点)
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW
PROPAGATION_NESTED
事务状态
TransactionStatus
-
是否有保存点
-
是否是一个新的事务
-
事务是否已经提交
关系:
关系:PlatformTransactionManager通过TransactionDefinition设置事务相关信息管理事务,管理事务过程中,产生一些事务状态,状态由TransactionStatus记录。
四、使用XML文件配置事务
spring支持声明式事务管理,只需要配置文件,不需要额外的编写代码
演示如下:
1、 搭建环境
创建account表并插入两条数据
CREATE TABLE `account` (`id` int(11) NOT NULL AUTO_INCREMENT,`money` double DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;INSERT INTO `account` VALUES ('1', '1000');
INSERT INTO `account` VALUES ('2', '1000');
新建项目略
导入pom.xml依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wmj</groupId><artifactId>SpringTX</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- spring相关依赖,版本必须保持一致 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.24</version></dependency><!--spring数据连接支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.24</version></dependency><!--aop支持 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.9.1</version></dependency><!-- 事务 --><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.24</version></dependency><!-- mybatis相关依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency><!-- myabtis整合spring依赖,必须导入 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.7</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.31</version></dependency><!--德鲁伊数据连接池支持 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.9</version></dependency><!--lombok注解支持 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><!--log4j日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!--单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>
</project>
2、 配置及业务编写
配置mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置日志 --><settings><setting name="logImpl" value="LOG4J"/></settings></configuration>
配置日志
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
配置数据源
db.username = 帐号
db.password = 密码
db.url = jdbc:mysql:///库名?serverTimezone=Asia/Shanghai&characterEncoding=UTF8
db.driverClassName = com.mysql.cj.jdbc.Driver
搭建后端业务代码
控制层
package com.wmj.controller;import com.wmj.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/2/13 16:04*/
@Controller
public class TestController {@Autowiredprivate TestService service;public void testTx(Integer id1,Integer id2,Double money){service.transferMoney(id1,id2,money);}
}
业务层接口及其实现类
package com.wmj.service;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/2/13 16:10*/public interface TestService {void transferMoney(Integer id1, Integer id2, Double money);
}
package com.wmj.service.impl;import com.wmj.mapper.TestMapper;
import com.wmj.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/2/13 16:11*/
@Service
public class TestServiceImpl implements TestService {@Autowiredprivate TestMapper mapper;@Overridepublic void transferMoney(Integer id1, Integer id2, Double money) {mapper.dmoney(id1,money);int a = 1/0;mapper.amoney(id2,money);}
}
持久层接口及其xml数据访问
package com.wmj.mapper;import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/2/13 16:12*/
@Repository
public interface TestMapper {Integer dmoney(@Param("id1") Integer id1, @Param("money") Double money);Integer amoney(@Param("id2") Integer id2, @Param("money") Double money);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.wmj.mapper.TestMapper"><update id="dmoney">update account set money = money - #{money} where id = #{id1}</update><update id="amoney">update account set money = money + #{money} where id = #{id2}</update>
</mapper>
配置spring核心配置文件application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- bean definitions here --><!-- 扫描包下的注解 --><context:component-scan base-package="com.wmj"></context:component-scan><!-- 引入db.properties配置文件 --><context:property-placeholder location="classpath:db.properties"></context:property-placeholder><!-- 配置数据库链接 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="username" value="${db.username}"></property><property name="password" value="${db.password}"></property><property name="url" value="${db.url}"></property><property name="driverClassName" value="${db.driverClassName}"></property></bean><!-- 配置SqlSession --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- dataSource属性(必选属性) --><property name="dataSource" ref="dataSource"></property><!-- configLocation属性配置mybatis-config.xml(非必选属性)--><property name="configLocation" value="classpath:mybatis-config.xml"></property><!-- mapperLocations属性用于配置Mapper.xml文件所在位置 (非必选属性)--><property name="mapperLocations" value="classpath:mapper/*.xml"></property></bean><!-- 扫描Mapper --><bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.wmj.mapper"></property></bean><!-- 事务核心管理器,封装了所有事务操作. 依赖于连接池 --><bean name="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 配置事务通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- 企业中配置CRUD方法一般使用方法名+通配符*的形式配置通知,此时类中的方法名要和配置的方法名一致 --><!-- 以方法为单位,指定方法应用什么事务属性isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。--><tx:method name="transferMoney" isolation="REPEATABLE_READ"propagation="REQUIRED" read-only="false" /></tx:attributes></tx:advice><!-- 配置织入 --><aop:config><!-- 配置切点表达式 --><aop:pointcut expression="execution(* com.wmj.service.impl.*ServiceImpl.*(..))"id="txPc" /><!-- 配置切面 : 通知+切点 advice-ref:通知的名称 pointcut-ref:切点的名称 --><aop:advisor advice-ref="txAdvice" pointcut-ref="txPc" /></aop:config></beans>
3、 测试
package com.test;import com.wmj.controller.TestController;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/2/13 16:02*/public class Demo1 {@Testpublic void testTX(){ClassPathXmlApplicationContext applicationContext =new ClassPathXmlApplicationContext("application.xml");TestController controller = (TestController)applicationContext.getBean("testController");controller.testTx(1,2,200.00);}
}
执行结果:
当没有遇到异常时,转账能正常执行,不在演示,此处演示当遇到异常时的事务效果
代码执行前数据库:
当遇到异常,代码终止执行,此时数据库
转账并没有进行提交,此时说明我们的事务配置成功!
五、使用注解形式进行事务开发
spring给我们提供了事务注解开发的方式,大大减少了代码编写,十分方便
创建项目配置基本与上方相同,我们将application.xml内容进行修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here --><!-- 导入外部配置文件 db.properties --><context:property-placeholder location="classpath:db.properties"></context:property-placeholder><!-- 配置数据源对象 --><bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource"><!-- 导入 db.properties 中的值--><property name="username" value="${db.username}"></property><property name="password" value="${db.password}"></property><property name="url" value="${db.url}"></property><property name="driverClassName" value="${db.driver}"></property></bean><!-- 扫描对应包下的注解 --><context:component-scan base-package="com.wmj"></context:component-scan><!-- 配置sqlSessionFactory --><bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 必选配置 --><property name="dataSource" ref="datasource"></property><!-- 非必选属性,根据自己需求去配置 --><!-- 导入 mybatis-config.xml --><property name="configLocation" value="classpath:mybatis-config.xml"></property><!-- 导入 Mapper.xml 文件,classpath后面不能有空格 --><property name="mapperLocations" value="classpath:mapper/*.xml"></property></bean><!-- 扫描 Mapper 接口,生成代理对象 --><bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 指定扫描的具体位置 --><property name="basePackage" value="com.wmj.mapper"></property></bean><!-- 配置事务 --><!-- 事务平台管理器,封装了所有的事务操作,依赖数据源 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="datasource"></property></bean><!-- 开启注解驱动事务支持 --><tx:annotation-driven></tx:annotation-driven></beans>
将业务实现类改造如下:
package com.wmj.service.impl;import com.wmj.mapper.AccountMapper;
import com.wmj.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;/*** @Transactional 配置事务* 可以写在类上,也可以写在方法上*/
//@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,readOnly = false)
@Service
package com.wmj.service.impl;import com.wmj.mapper.TestMapper;
import com.wmj.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/2/13 16:11*/
/*** @Transactional 配置事务* 可以写在类上,也可以写在方法上*/
//@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,readOnly = false)
@Service
public class TestServiceImpl implements TestService {@Autowiredprivate TestMapper mapper;@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,readOnly = false)@Overridepublic void transferMoney(Integer id1, Integer id2, Double money) {mapper.dmoney(id1,money);int a = 1/0;mapper.amoney(id2,money);}
}
测试略
总结
本次主要记录了spring的事务支持,及其两种开发方式。再会!!!
相关文章:
Spring-事务2
文章目录前言一、事务的特性(ACID)二、事务的隔离级别三、spring中的事务平台事务管理器.事务定义ISOLation_XXX:**事务隔离级别.**PROPAGATION_XXX:**事务的传播行为**.事务状态关系:四、使用XML文件配置事务1、 搭建…...
Windows Git Bash 配置
Windows Git Bash 配置 本文参考的文章: 在 Windows 的 Git Bash 中使用包管理器 - iris (ginshio.org)Git bash 安装 pacman & Windows 解压 zst 文件 | 伪斜杠青年 (lckiss.com) 一、Git的安装 Git 的安装应该是都会的,但还是应该说以下&#…...
java代码整合kettle9.3实现读取表中的数据,生成excel文件
java代码整合kettle9.3实现读取表中的数据,生成excel文件 1.简介 本次使用java代码整合kettle9.3版本,数据库使用mysql。 2.jar包导入 项目需要依赖部分kettle中的jar包,请将这部分jar包自行导入maven仓库。 <dependency><groupId…...
分享微信点餐小程序搭建步骤_微信点餐功能怎么做
线下餐饮实体店都开始摸索发展网上订餐服务。最多人选择的是入驻外卖平台,但抽成高,推广还要另买流量等问题,也让不少商家入不敷出。在这种情况下,建立自己的微信订餐小程序,做自己的私域流量是另一种捷径。那么&#…...
4、数组、切片、map、channel
目录一、数组二、切片三、map四、channel五、引用类型一、数组 数组: 数组是块连续的内存空间,在声明的时候必须指定长度,且长度不能改变所以数组在声明的时候就可以把内存空间分配好,并赋上默认值,即完成了初始化数组…...
270 uuid
270 uuid 用途 For the creation of RFC4122 UUIDs 可靠性 10000 星星 适应于浏览器或者服务器 官网链接 https://www.npmjs.com/package/uuid https://github.com/uuidjs/uuid 基本使用 import { v4 as uuidv4 } from uuid; uuidv4(); // ⇨ 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3d…...
2023最新简历模板免费下载
下面分享5个简历模板网站,免费下载,建议收藏! 2023用最漂亮的简历模板,让面试官眼前一亮。 1、菜鸟图库 个人简历模板|WORD文档模板免费下载 - 菜鸟图库 菜鸟图库除了有超多设计类素材之外,还有很多办公类素材&#…...
【CSS】元素居中总结-水平居中、垂直居中、水平垂直居中
【CSS】元素居中一、 水平居中1.行内元素水平居中(1)text-align2.块级元素水平居中2.1 margin(1)margin2.2布局(1)flex justify-content(推荐)(2) flexmargin…...
spring实现AOP
文章目录前言一、AOP的底层实现原理二、AOP的两种开发模式1.使用xml配置文件1.1 添加AOP依赖1.2 创建UserService1.3创建UserServiceImpl1.4创建通知类1.5 创建applicationContext.xml(添加aop约束)1.6 测试2.使用注解开发2.1 创建bean.xml文件配置注解方…...
neovim搭建cpp环境
文章目录Windowns下NeoVim搭建cpp环境NeoVim安装插件vim-plugindentLinevim-airlinectagstagbarcoc.vimWindowns下NeoVim搭建cpp环境 在开发过程中习惯在DIE环境中使用vim作为编辑器,在单独的编辑器也常使用gvim图形化编辑器。最近看到NeoVim的特性及兼容性方面不输…...
SpringBoot AES加密 PKCS7Padding 模式
AES 简介:DES 全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS) AES 密码学中的高级加密标准(Advan…...
按键输入驱动
目录 一、硬件原理 二、添加设备树 1、创建pinctrl 2、创建节点 3、检查 编译复制 三、修改工程模板编辑 四、驱动编写 1、添加keyio函数 2、添加调用 3、驱动出口函数添加释放 4、添加原子操作 5、添加两个宏定义 6、初始化原始变量 7、打开操作 8、读操作 总体代…...
2023年第七周总周结 | 开学倒数第三周
为什么要做周总结? 1.避免跳相似的坑 2.客观了解上周学习进度并反思,制定可完成的下周规划 一、上周问题解决情况 晚上熬夜导致第二天学习状态不好 这周熬夜一天,晚上帮亲戚修手机到22:30,可能是晚上自己的事什么都没做ÿ…...
Springboot扫描注解类
Springboot扫描注解类的入口在AbstractApplicationContext的refresh中,对启动步骤不太了解的,可参考https://blog.csdn.net/leadseczgw01/article/details/128930925BeanDefinitionRegistryPostProcessor接口有多个实现类,扫描Controller、Se…...
Apache日志分析器
您的Apache HTTP服务器生成的日志数据是信息的宝库。使用这些信息,您可以判断您服务器的使用情况、找出漏洞所在,并设法改进服务器结构和整体性能。审核您的Apache日志可在以下情况派上用场,其中包括:识别和纠正频繁出现的错误以增…...
啪,还敢抛出异常
🙉 作者简介: 全栈领域新星创作者 ;天天被业务折腾得死去活来的同时依然保有对各项技术热忱的追求,把分享变成一种习惯,再小的帆也能远航。 🏡 个人主页:xiezhr的个人主页 前言 去年又重新刷了…...
Apache JMeter 5.5 下载安装以及设置中文教程
Apache JMeter 5.5 下载安装以及设置中文教程JMeter下载Apache JMeter 5.5配置环境变量查看配置JDK配置JMeter环境变量运行JMeter配置中文版一次性永久设置正文JMeter 下载Apache JMeter 5.5 官方网站:Apache JMeter 官网 版本介绍: 版本中一个是Bina…...
string类模拟实现
了解过string常用接口后,接下来的任务就是模拟实现string类。 目录 VS下的string结构 默认成员函数和简单接口 string结构 c_str()、size()、capacity()、clear()、swap() 构造函数 拷贝构造函数 赋值重载 析构函数 访问及遍历 容量操作 reserve resize …...
cadence SPB17.4 S032 - allegro - 保存/载入光绘层定义
文章目录cadence SPB17.4 S032 - allegro - 保存/载入光绘层定义概述保存光绘层在新板子中载入已经保存的相同类型老板子定义好的光绘层定义文件碎碎念ENDcadence SPB17.4 S032 - allegro - 保存/载入光绘层定义 概述 以前布线完成, 准备出板厂文件时, 总是要手工重新建立光绘…...
微服务实战--高级篇:分布式缓存 Redis
分布式缓存 – 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题: 1.Redis持久化 Redis有两种持久化方案: RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件)…...
【C语言】可变参数列表
本篇博客让我们来认识一下C语言学习过程中往往被忽略的可变参数列表 所谓可变参数,就是一个不限定参数数量的函数,我们可以往里面传入任意个数的参数,以达成某些目的。 关联:C11可变模板参数;本文首发于 慕雪的寒舍 …...
目标检测的旋框框文献学习
这是最近打算看完的文献,一天一篇 接下来将记录一下文献阅读笔记,避免过两天就忘了 RRPN 论文题目:Arbitrary-Oriented Scene Text Detection via Rotation Proposals 论文题目:通过旋转方案进行任意方向的场景文本检测&#x…...
Hive 在工作中的调优总结
总结了一下在以往工作中,对于Hive SQL调优的一些实际应用,是日常积累的一些优化技巧,如有出入,欢迎在评论区留言探讨~ EXPLAIN 查看执行计划 建表优化 分区 分区表基本操作,partitioned二级分区动态分区 分桶 分…...
每天一道大厂SQL题【Day09】充值日志SQL实战
每天一道大厂SQL题【Day09】充值日志SQL实战 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&#…...
MATLAB 遗传算法
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
探讨 Java 中 valueOf 和 parseInt 的区别
前言 在编程中,遇到类型转换,好像会经常用到 parseInt 和 valueOf,当然这里只拿 Integer 类型进行陈述,其他类型也是雷同的; 想必有读者也跟我一样,经常交叉使用这两个方法,但却不知道这两者到…...
JSON学习笔记
♥课程链接:【狂神说Java】一小时掌握JSON_哔哩哔哩_bilibili配套的当然还要学习ajax不管是前端后端,感觉这部分内容是必须的,不然真的做项目的时候云里雾里。总体json的内容不多,具体就:1. 列表、对象等语法格式2. js…...
家政服务小程序实战教程07-轮播图组件
小程序中首页一般显示轮播图的功能,点击轮播图会跳转到具体的一篇文章或者是产品,本篇我们就介绍一下轮播图功能的开发 01 设计数据源 我们轮播图组件需要两个字段,一个是展示的图片,一个是跳转页面传入的参数。打开数据源&…...
MySQL之索引创建、删除、唯一索引、普通索引、及命名规则、注意事项
一、MySQL 索引 定义 索引是一个数据结构,用于加速数据库表中数据的查询。索引存储了一些数据表中的列值,以及这些列值在数据表中的位置,这样就可以通过索引来快速查找到数据表中的某一行数据。 MySQL 支持多种索引类型,包括普通…...
【C++设计模式】学习笔记(3):策略模式 Strategy
目录 简介动机(Motivation)模式定义结构(Structure)要点总结笔记结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金…...
大型网站建设定制/百度搜索关键词怎么刷上去
题目:给定一个序列,判断其是不是一颗二叉排序树的后序遍历结果 分析:首先要知道什么是排序二叉树,二叉排序树是这样定义的,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (…...
做网站推广怎么做/网站推广的平台
1,istio 概念 1.2 istio 是什么? 使用云平台可以为组织提供丰富的好处。然而,不可否认的是,采用云可能会给 DevOps 团队带来压力。开发人员必须使用微服务已满足应用的可移植性,同时运营商管理了极其庞大的混合和多云部…...
wordpress默认注册框/石家庄seo网站管理
数据库系统-数据库设计 数据库设计概述及六步骤简介 数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求。 数据库设计的特点 数据库设计是一…...
wordpress远程图片下载插件/站长素材
flowable 新增了idm模块,主要用于管理flowable-admin、flowable-idm、flowable-modeler、flowable-rest、flowable-task等模块。 flowable idm用于管理 的表如下: act_id_priv、act_id_group、act_id_membership、act_id_priv_mapping、act_id_property、…...
商城网站建设用乐云seo系统/什么是竞价
众所周知SSD的读写速度远比hdd磁盘要快,理解ssd的工作原理使我们开发处高效储存方案。 linux 相关指令 fstrim --fstab --verbose ## 回收(discard)文件系统上对应磁盘未使用的块 blkdiscard /dev/nvme1n1 ## 回收并擦除(discard)整个SSD块设备 wipefs -a /dev/n…...
北京工作室网站建设/seo工具有哪些
属性查询是GIS应用不可缺少的重要功能,尤其是在各种业务系统中,根据用户输入相应的查询条件,从属性要素中快速定位到用户感兴趣的要素,为业务应用提供了便利。本文就来聊一聊QGis二次开发中如何实现属性查询功能。其实这个功能我在…...