当前位置: 首页 > news >正文

Java事务入门:从基础概念到初步实践

在这里插入图片描述

Java事务入门:从基础概念到初步实践

  • 引言
  • 1. Java事务基础概念
    • 1.1 什么是事务?
    • 1.2 为什么需要事务?
  • 2. Java事务管理
    • 2.1 JDBC 的事务管理
    • 2.2 Spring 事务管理
      • 2.2.1 Spring + JDBC
        • 2.2.1.1 添加 Spring 配置
        • 2.2.1.2 添加业务代码并测试验证
      • 2.2.2 Spring + JPA
        • 2.2.2.1 JPA相关依赖
        • 2.2.2.2 添加 JPA 配置
        • 2.2.2.3 添加 Spring 配置
        • 2.2.2.4 添加实体类
        • 2.2.2.5 添加业务代码并测试验证
      • 2.2.3 Spring + Mybatis Plus
        • 2.2.3.1 涉及依赖
        • 2.2.3.2 添加 Spring 配置
        • 2.2.3.3 添加实体类
        • 2.2.2.4 添加业务代码并测试验证
  • 示例
  • 总结

引言

Java 语言相关的应用开发中,事务(Transaction)是其中一个核心概念,尤其是在涉及数据库操作时。理解并正确使用事务,可以确保应用系统数据的完整性和一致性。本文 Huazie 将带您从 Java 事务的基础概念出发,通过不同场景的事物管理实操,帮助您快速入门 Java 事务。

1. Java事务基础概念

1.1 什么是事务?

事务是数据库操作的基本执行单元,它要么完全地执行,要么完全地不执行。

事务作为一个逻辑工作单位,其关键特性【数据的完整性和一致性】就体现在其 ACID 属性上,如下:

  • 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改要么全都执行,要么全都不执行。
  • 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  • 隔离性(Isolation):事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(Durability):持久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。

1.2 为什么需要事务?

我们先来想一下如下的场景:

多个数据库操作之间,有部分操作成功,部分操作失败,会咋样?

显然这个时候,应用系统的数据就会处于不一致的状态。这种不一致可能会带来非常严重的后果,包括但不限于如下:

  • 数据错误:由于某些操作成功而某些操作失败,数据可能处于一个中间状态,既不完全符合操作前的状态,也不符合操作后预期的状态。
  • 业务逻辑错误:当数据出现不一致时,基于这些数据执行的业务逻辑可能会出现错误。例如,在一个订单系统中,如果订单的创建和库存的减少操作没有同时成功,那么可能会导致订单状态与库存状态不匹配,从而影响整个业务流程。
  • 系统可靠性降低:一个不可靠的数据系统可能会导致更多的错误和故障,需要更多的维护和支持,从而增加运营成本。

因此,为了避免这种情况,在多个数据库操作之间,我们就需要一种机制来确保这些操作要么全部成功,要么全部失败。而事务正是为了解决这个问题而存在的。

2. Java事务管理

Java 中,我们可以使用 JDBCSpringJPAMyBatis(MyBatis Plus) 等框架来管理数据库事务。这些框架提供了丰富的 API 和工具,使我们能够轻松地管理事务。

2.1 JDBC 的事务管理

JDBC 中,我们可以通过设置 Connection 对象的 autoCommit 属性来开启或关闭事务。

  • autoCommittrue 时,每次执行 SQL 语句都会自动提交事务;
  • autoCommitfalse 时,我们需要手动调用 commit()rollback() 方法来提交或回滚事务。

我们来看一个简单的 JDBC 事务管理示例:

	@Testpublic void testJDBCTransaction() throws Exception {// flea-config.xml 中配置FleaJDBCConfig.init(DBSystemEnum.MySQL.getName(), "fleajpatest");Connection conn = null;PreparedStatement pstmt1 = null;PreparedStatement pstmt2 = null;try {conn = FleaJDBCConfig.getConfig().getConnection();// 关闭自动提交conn.setAutoCommit(false);// 执行第一条SQL语句String sql1 = "UPDATE student SET stu_age = stu_age-10 WHERE stu_name='huazie'";pstmt1 = conn.prepareStatement(sql1);pstmt1.executeUpdate();LOGGER.debug("执行第一条SQL语句");// 模拟异常throwEx();// 执行第二条SQL语句String sql2 = "UPDATE student SET stu_age = stu_age+12 WHERE stu_name='huazie'";pstmt2 = conn.prepareStatement(sql2);pstmt2.executeUpdate();LOGGER.debug("执行第二条SQL语句");// 提交事务conn.commit();LOGGER.debug("提交事物");} catch (SQLException e) {if (null != conn) {try {// 回滚事务conn.rollback();LOGGER.debug("回滚事物");} catch (SQLException ex) {}}} finally {// 关闭资源if (null != pstmt2) pstmt2.close();if (null != pstmt1) pstmt1.close();if (null != conn) conn.close();}}private void throwEx() throws SQLException {throw new SQLException("Test Exception");}

在开始测试之前,先来看看要操作的数据【如下红框所示】:

在这里插入图片描述

上述示例中,执行完第一条语句之后,模拟抛出异常,我们来运行一下,可以看到如下结果:

在这里插入图片描述

同时检查数据库中发现数据没变,说明第一条 SQL 语句也没有执行成功,可见已经被回滚了。

现在,我们将模拟异常的代码去除,然后断点调试下看下两条语句执行完,但还没有提交的情况,如下:

在这里插入图片描述

从上述截图,可知连接在提交之前,数据还是原来的。

继续执行,连接被提交,我们可以看到 stu_age 已经被更改为 22,可见示例中的两条 SQL 语句已经执行成功。

在这里插入图片描述

2.2 Spring 事务管理

Spring 提供了强大的声明式事务管理功能,我们可以将事务管理与业务逻辑分离,在不修改业务代码的情况下,为业务方法添加事务支持。

Spring 事务管理的核心接口是 PlatformTransactionManager,它是所有事务管理器的抽象。Spring 提供了多种事务管理器的实现。我们可以通过配置来选择合适的事务管理器,以便于 Spring 结合 JDBCJPAMyBatis(Mybatis Plus) 等框架来管理事物。

2.2.1 Spring + JDBC

2.2.1.1 添加 Spring 配置

在 Spring 配置文件中,我们需要配置数据源,如下:

	<bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/fleajpatest?useUnicode=true&amp;characterEncoding=UTF-8" /><property name="username" value="替换成你的MySQL用户名" /><property name="password" value="替换成你的MySQL用户密码" /></bean>

配置 JdbcTemplate,用于使用 JDBC 操作数据库,如下:

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="jdbcDataSource"/></bean>

配置事物管理器 DataSourceTransactionManager,如下:

	<bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="jdbcDataSource" /></bean>

最后,在 Spring 配置文件中,我们需要开启对应的事务管理功能,如下:

    <tx:annotation-driven transaction-manager="jdbcTransactionManager"/>
2.2.1.2 添加业务代码并测试验证

下面让我们添加业务代码,来演示下具体的事物管理,如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class StudentService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactional("jdbcTransactionManager")public void service() throws SQLException {// 插入一条记录String sql = "insert into student(stu_name, stu_age, stu_sex, stu_state) values(?, ?, ?, ?)";jdbcTemplate.update(sql, "LGH", "18", 1, 1);sql = "update student set stu_state = ? where stu_name = ?";jdbcTemplate.update(sql, 0, "LGH");throwEx();}private void throwEx() throws SQLException {throw new SQLException("Test Exception");}
}

需要注意的是,这里抛出的异常还是 SQLException,它是 java.lang.Exception 的子类。

继续添加测试代码如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class StudentSpringJDBCTest {private static final Logger LOGGER = LoggerFactory.getLogger(StudentSpringJDBCTest.class);@Resource(name = "studentService")private StudentService studentService;@Testpublic void testSpringJDBCTransaction() throws Exception {studentService.service();}
}

现在运行上述测试代码,结果如下:

在这里插入图片描述

从上图可知,虽然这里抛出了异常,但是实际数据还是提交成功了。

那这里是什么原因呢?

这就要提到刚才抛出的异常了【即 SQLException】,Spring 事物管理能处理的异常一定要是RuntimeException及其子类 或者 Error及其子类,否则事物无法回滚。

可见如下截图【这块后续有时间展开讲解下】:

在这里插入图片描述
在这里插入图片描述

我们重新来修改一下业务代码,抛出 RuntimeException 异常 :

 @Transactional("jdbcTransactionManager")public void service() throws RuntimeException {// 省略。。。throwEx();}private void throwEx() throws RuntimeException {throw new RuntimeException("Test Exception");}

继续运行测试代码,执行结果如下:

在这里插入图片描述

可以看到,除了之前新增的,本次要处理的 SQL 并没有执行到数据库。

现在,让我们把抛出异常的代码注释掉,运行结果如下:

在这里插入图片描述

从上截图中可知,要处理的 SQL 都已经成功执行。

2.2.2 Spring + JPA

2.2.2.1 JPA相关依赖

Spring Data JPA 依赖

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>2.5.0</version>
</dependency>

EclipseLink 的 JPA 实现依赖

<dependency><groupId>org.eclipse.persistence</groupId><artifactId>eclipselink</artifactId><version>2.5.0</version>
</dependency>
2.2.2.2 添加 JPA 配置

在资源文件夹的 META-INF 目录下添加 fleajpa-persistence.xml,配置持久化单元的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"><persistence-unit name="fleajpa" transaction-type="RESOURCE_LOCAL"><!-- provider --><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider><!-- Connection JDBC --><class>com.huazie.fleadbtest.jpa.common.entity.Student</class><exclude-unlisted-classes>true</exclude-unlisted-classes><properties><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /><property name="javax.persistence.jdbc.url"value="jdbc:mysql://localhost:3306/fleajpatest?useUnicode=true&amp;characterEncoding=UTF-8" /><property name="javax.persistence.jdbc.user" value="替换成你的MySQL用户名" /><property name="javax.persistence.jdbc.password" value="替换成你的MySQL用户密码" /></properties></persistence-unit></persistence>
2.2.2.3 添加 Spring 配置

Spring 配置文件中,添加 JPA 相关的默认 Bean,用来初始化 LocalContainerEntityManagerFactoryBean,如下:

	<bean id="defaultPersistenceManager"class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"><property name="persistenceXmlLocations"><!-- 可以配置多个持久单元 --><list><value>classpath:META-INF/fleajpa-persistence.xml</value></list></property></bean><bean id="defaultPersistenceProvider" class="org.eclipse.persistence.jpa.PersistenceProvider"/><!--<bean id="defaultLoadTimeWeaver" class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>--><bean id="defaultVendorAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"><property name="showSql" value="true"/></bean><bean id="defaultJpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"/>

配置 LocalContainerEntityManagerFactoryBean,它是 Spring Data JPA 中用于创建和管理 EntityManagerFactory 的一个核心类,如下所示:

	<bean id="fleaJpaEntityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="persistenceUnitManager" ref="defaultPersistenceManager"/><property name="persistenceUnitName" value="fleajpa"/><property name="persistenceProvider" ref="defaultPersistenceProvider"/><property name="jpaVendorAdapter" ref="defaultVendorAdapter"/><property name="jpaDialect" ref="defaultJpaDialect"/><property name="jpaPropertyMap"><map><entry key="eclipselink.weaving" value="false"/><entry key="eclipselink.logging.thread" value="true"/></map></property></bean>

配置 JPA 事物管理器 JpaTransactionManager,如下:

	<bean id="fleaJpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="fleaJpaEntityManagerFactory"/></bean>

启用 Spring Data JPA 仓库扫描,如下:

    <jpa:repositories base-package="com.huazie.fleadbtest.jpa.repository"entity-manager-factory-ref="fleaJpaEntityManagerFactory"transaction-manager-ref="fleaJpaTransactionManager"/>

最后,在 Spring 配置文件中,还需要开启对应的事务管理功能,如下:

    <tx:annotation-driven transaction-manager="fleaJpaTransactionManager"/>
2.2.2.4 添加实体类

新建如下实体类 Student,对应测试表 student

@Entity
@Table(name = "student")
public class Student implements FleaEntity {private static final long serialVersionUID = 1267943552214677159L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "STUDENT_SEQ")@SequenceGenerator(name = "STUDENT_SEQ")@Column(name = "stu_id", unique = true, nullable = false)private Long stuId; // 学生编号@Column(name = "stu_name", nullable = false)private String stuName; // 学生姓名@Column(name = "stu_age", nullable = false)private Integer stuAge; // 学生年龄@Column(name = "stu_sex", nullable = false)private Integer stuSex; // 学生性别(1:男 2:女)@Column(name = "stu_state", nullable = false)private Integer stuState; // 学生状态(0:删除 1:在用)// ... 省略get和set方法@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this);}
}
2.2.2.5 添加业务代码并测试验证

首先,添加 StudentRepository,用于访问 Student 实体相关的数据库操作的接口

public interface StudentRepository extends JpaRepository<Student, Long> {
}

接着,添加如下业务代码:

@Service
public class StudentService {@Autowiredprivate StudentRepository studentRepository;@Transactional("fleaJpaTransactionManager")public void service() throws RuntimeException {Student student = new Student();student.setStuName("杜甫");student.setStuAge(35);student.setStuSex(1);student.setStuState(1);studentRepository.save(student);student.setStuState(0);studentRepository.save(student);throwEx();}private void throwEx() throws RuntimeException {throw new RuntimeException("Test Exception");}
}

最后,添加自测类,如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class StudentSpringJPATest {@Resource(name = "studentService")private StudentService studentService;@Testpublic void testSpringJDBCTransaction() throws Exception {studentService.service();}
}

一切准备就绪,我们来运行上述自测类,结果如下:

在这里插入图片描述

从上述截图可见,业务代码抛出了异常,相关的数据库操作并未执行成功。【注意: 这里抛出的异常也一定要是RuntimeException及其子类 或者 Error及其子类

将抛出异常的代码注释掉,再来运行一下看看,如下:

在这里插入图片描述

从上图中,我们可以看出业务代码的数据操作已经成功执行到了数据库中。

2.2.3 Spring + Mybatis Plus

2.2.3.1 涉及依赖

alibaba 的数据库连接池 druid 依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.0</version>
</dependency>

mybatis 依赖:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version>
</dependency>

Mybatis Plus 依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.5.1</version>
</dependency>
2.2.3.2 添加 Spring 配置

在 Spring 配置文件中,添加数据源配置,如下:

	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/fleajpatest?useUnicode=true&amp;characterEncoding=UTF-8" /><property name="username" value="替换成你的MySQL用户名" /><property name="password" value="替换成你的MySQL用户密码" /></bean>

配置 SqlSessionFactory,如下所示:

	<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="typeAliasesPackage" value="com.huazie.fleadbtest.mybatisplus.entity"/></bean>

配置 MapperScan,如下所示:

	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.huazie.fleadbtest.mybatisplus.mapper"/></bean>

配置事物管理器 DataSourceTransactionManager,如下:

	<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean>

最后,在 Spring 配置文件中,还需要开启对应的事务管理功能,如下:

    <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
2.2.3.3 添加实体类

新建如下实体类 Student,对应测试表 student

@Data
@TableName("student")
public class Student {@TableId(value = "stu_id", type = IdType.AUTO)private Long stuId; // 学生编号@TableField(value = "stu_name")private String stuName; // 学生姓名@TableField(value = "stu_age")private Integer stuAge; // 学生年龄@TableField(value = "stu_sex")private Integer stuSex; // 学生性别(1:男 2:女)@TableField(value = "stu_state")private Integer stuState; // 学生状态(0:删除 1:在用)}
2.2.2.4 添加业务代码并测试验证

添加学生服务层接口类,如下:

public interface IStudentService extends IService<Student> {void service() throws RuntimeException;
}

添加学生服务层实现类,如下:

@Service("studentServiceImpl")
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService {@Override@Transactional("dataSourceTransactionManager")public void service() throws RuntimeException {Student student = new Student();student.setStuName("李白");student.setStuAge(25);student.setStuSex(1);student.setStuState(1);baseMapper.insert(student);student.setStuState(0);baseMapper.updateById(student);throwEx();}private void throwEx() throws RuntimeException {throw new RuntimeException("Test Exception");}}

最后,添加自测类,如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class StudentServiceSpringTest {@Resource(name = "studentServiceImpl")private IStudentService studentService;@Testpublic void testSpringMybatisPlusTransaction() throws RuntimeException {studentService.service();}
}

现在,我们可以运行上述自测类,结果如下:

在这里插入图片描述

从上述截图可见,自定义异常已经被抛出,并且数据库中也没有执行成功,说明事物已经回滚了。

现在将抛出异常的代码注释掉,再来运行看看,如下:

在这里插入图片描述

从上图可知,相关数据库操作已经成功执行。

示例

相关演示示例请查看 GitHub 上的 flea-db-test 测试项目。

总结

本文 HuazieJava 事物的基础概念出发,带大家通过不同的事物管理方式进行实践,进一步加深了对 Java 事物的理解。

相关文章:

Java事务入门:从基础概念到初步实践

Java事务入门&#xff1a;从基础概念到初步实践 引言1. Java事务基础概念1.1 什么是事务&#xff1f;1.2 为什么需要事务&#xff1f; 2. Java事务管理2.1 JDBC 的事务管理2.2 Spring 事务管理2.2.1 Spring JDBC2.2.1.1 添加 Spring 配置2.2.1.2 添加业务代码并测试验证 2.2.2…...

鸿蒙轻内核M核源码分析系列七 动态内存Dynamic Memory

内存管理模块管理系统的内存资源&#xff0c;它是操作系统的核心模块之一&#xff0c;主要包括内存的初始化、分配以及释放。 在系统运行过程中&#xff0c;内存管理模块通过对内存的申请/释放来管理用户和OS对内存的使用&#xff0c;使内存的利用率和使用效率达到最优&#x…...

从头搭hadoop集群--分布式hadoop集群搭建

模板虚拟机安装配置见博文&#xff1a;https://blog.csdn.net/weixin_66158110/article/details/139236148 配置文件信息如下&#xff1a;https://pan.baidu.com/s/1074eD5aNVugEPcjwVvi9jA?pwdl1xq&#xff08;提取码&#xff1a;l1xq&#xff09; hadoop版本&#xff1a;h…...

odoo10 权限控制用户只允许看到自己的字段

假设一个小区管理员用户&#xff0c;只想看到自己小区的信息。 首先添加一个用户信息选项卡界面&#xff0c;如下图的 用户 > 隶属信息&#xff1a; 我们在自己创建的user模块中&#xff0c;views文件夹下添加base_user.xml <?xml version"1.0" encoding&q…...

图解Mysql索引原理

概述 是什么 索引像是一本书的目录列表&#xff0c;能根据目录快速的找到具体的书本内容&#xff0c;也就是加快了数据库的查询速度索引本质是一个数据结构索引是在存储引擎层&#xff0c;而不是服务器层实现的&#xff0c;所以&#xff0c;并没有统一的索引标准&#xff0c;…...

Arduino网页服务器:如何将Arduino开发板用作Web服务器

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天&#xff0c;我将和大家分享一个有趣且实用的项目——如何使用Arduino开发板搭建一个简易的网页服务器。通过这个项目&#xff0c;你可以将Arduino连接到互联网&#xff0c;并通过网页控制或查询Arduino的状态。 一、项目背景与…...

大模型日报2024-06-05

大模型日报 2024-06-05 大模型资讯 AI气象预测取得重大进展&#xff1a;单台桌面电脑即可运行全球天气模型 摘要: 一项新的人工智能天气预测模型已经取得重大进展&#xff0c;该模型能够在一台普通的桌面电脑上运行&#xff0c;预测全球天气。这意味着即使没有复杂的物理计算&a…...

LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关

角色扮演&#xff1a;在系统指令中告诉千问你需要它扮演的角色&#xff0c;即可沉浸式和该角色对话交流语言风格&#xff1a;简单调整 LLM 的语言风格任务设定&#xff1a;比如旅行规划&#xff0c;小红书文案助手这样的专项任务处理System message 也可以被用于规定 LLM 的答复…...

Spring系统学习 - Spring入门

什么是Spring&#xff1f; Spring翻译过来就是春天的意思&#xff0c;字面意思&#xff0c;冠以Spring的意思就是想表示使用这个框架&#xff0c;代表程序员的春天来了&#xff0c;实际上就是让开发更加简单方便&#xff0c;实际上Spring确实做到了。 官网地址&#xff1a;ht…...

Priority_queue

一、priority_queue的介绍和使用 1.1 priority_queue的介绍 1.优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。 2.优先队列类似于堆&#xff0c; 在堆中可以随时插入元素&#xff0c; 并且只能检索最大堆…...

SpringMVC:获取请求数据

1. 通过RequestParma注解接收 /**** value和name都可以使用&#xff0c;互为别名* 如果此处设置了需要什么参数而前端请求时没有提供则会报400&#xff08;请求参数不一致错误&#xff09;* required参数用于设置该参数是否为必须传递参数&#xff0c;默认为true必须传递* defa…...

深度学习 --- stanford cs231 编程作业(assignment1,Q2: SVM分类器)

stanford cs231 编程作业之SVM分类器 写在最前面&#xff1a; 深度学习&#xff0c;或者是广义上的任何学习&#xff0c;都是“行千里路”胜过“读万卷书”的学识。这两天光是学了斯坦福cs231n的一些基础理论&#xff0c;越往后学越觉得没什么。但听的云里雾里的地方也越来越多…...

【scikit-learn010】sklearn算法模型清单实战及经验总结(已更新)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架模型算法包相关技术点及经验。 3.欢迎批评指正,欢迎互三,跪谢一键…...

Rethinking overlooked aspects in vision-language models

探讨多模态视觉语言模型的一些有趣结论欢迎关注 CVHub!https://mp.weixin.qq.com/s/zouNu-g-33_7JoX3Uscxtw1.Introduction 多模态模型架构上的变化不大,数据的差距比较大,输入分辨率和输入llm的视觉token大小是比较关键的,适配器,VIT和语言模型则不是那么关键。InternVL-…...

【漯河市人才交流中心_登录安全分析报告-Ajax泄漏滑动距离导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

C语言—字符函数和字符串函数

1.字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符的。 这些函数的使用都需要包含一个头文件 ctype.h。 例&#xff1a;将一句话中的小写字母改成大写字母。 2.字符转换函数 头文件&#xff1a;ctype.h C语言提供了2…...

爬山算法的详细介绍

爬山算法&#xff08;Hill Climbing Algorithm&#xff09;是一种基于启发式的局部搜索算法&#xff0c;常用于解决优化问题。它的核心思想是从当前解的邻域中选择能够使目标函数值最大&#xff08;或最小&#xff09;的下一个解作为当前解&#xff0c;直到找到一个满足问题要求…...

硕士课程 可穿戴设备之作业一

作业一 第一个代码使用的方法是出自于[1]。 框架结构 如下图&#xff0c;不过根据对代码的解读&#xff0c;发现作者在代码中省去了对SSR部件的实现&#xff0c;下文再说。 Troika框架由三个关键部件组成&#xff1a;信号分解&#xff0c;SSR和光谱峰值跟踪。&#xff08;粗…...

测试记录3:WLS2运行Linux界面

1.WLS1转到WLS2 &#xff08;1&#xff09;根据自己的平台&#xff0c;下载WLS2安装包 x64: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi arm64: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_arm64.msi &#xff08;2&…...

好用软件推荐

软件功能相关介绍地址FastStone截图&#xff08;长截图、定时截图等&#xff09;CSDNhttps://www.faststone.org/FSCaptureDownload.htmQuicker快捷访问https://getquicker.net/https://getquicker.net/...

王学岗鸿蒙开发(北向)——————(二)TS基本语法详解

1&#xff0c;Ts(TypeScript)语法相当于JAVAScript类型&#xff0c;鸿蒙arkTs是基于TS语言的,当然artTs也融合了其它的语言。 2&#xff0c;本篇文章是基于n9版本。注意,有些语法是已经不能用的。 3&#xff0c; 4&#xff0c;变量:用来存储数据,数字字母组成&#xff0c;数字不…...

【网络协议 | HTTP】HTTP总结与全梳理(一) —— HTTP协议超详细教程

&#x1f525;博客简介&#xff1a;开了几个专栏&#xff0c;针对 Linux 和 rtos 系统&#xff0c;嵌入式开发和音视频开发&#xff0c;结合多年工作经验&#xff0c;跟大家分享交流嵌入式软硬件技术、音视频技术的干货。   ✍️系列专栏&#xff1a;C/C、Linux、rtos、嵌入式…...

java基础选择题--11

1. 以下保留字( )不能出现在说明虚函数原型的语句中。A.static B.operator C.void D.const 参考答案&#xff1a;A 2. 一个类中只能定义一个析构函数。( )A.对 B.错 参考答案&#xff1a;A 解释&#xff1a; 在C中&#xff0c;一个类只能有一个析构函数。析构函数在对象生…...

欲除烦恼须无我,各有前因莫羡人

欲除烦恼须无我&#xff0c;各有前因莫羡人...

Vue的APP实现下载文件功能,并将文件保存到手机中

Vue的APP实现下载文件功能&#xff0c;并将文件保存到手机中 文字说明后台核心代码前台核心代码运行截图项目链接 文字说明 本文介绍Vue实现的APP&#xff0c;将文件下载并保存到手机中&#xff0c;为系统提供导出功能&#xff1b;同时支持导入&#xff0c;即选择本地的文件后&…...

泛微开发修炼之旅--07通过后端代码实现创建并发送待办、源码及示例

文章链接&#xff1a;泛微开发修炼之旅--07通过后端代码实现创建并发送待办、源码及示例...

轻松搭建AI应用的三个大模型技术路线

时下聊起AI&#xff0c;想必最热的就是使用AI的应用&#xff08;chatGPT&#xff0c;文心一言等&#xff09;来提升自己工作的效率&#xff0c;比如破局俱乐部&#xff0c;洋哥带领星球2万多人开启大航海&#xff0c;教人使用这一波新起的应用进行赚钱与赋能。 在我的视角来看…...

Vue01-vue的简介

一、Vue是什么&#xff1f; 一套用于构建用户界面的渐进式javaScript框架。 构建用户界面&#xff1a; 渐进式&#xff1a; 目前Vue的地位&#xff1a;生态完善&#xff0c;国内前端工程师必备技能。 二、Vue的特点 一个XXX.vue就是一个组件&#xff0c;封装的概念&#xff0c…...

leetcode455.分发饼干、376. 摆动序列、53. 最大子序和

455.分发饼干 为了满足更多的小孩&#xff0c;就不要造成饼干尺寸的浪费 大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子&#xff0c;那么就应该优先满足胃口大的 这里的局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最…...

JVM的内存结构

JVM 内存结构 方法区: 方法区主要用于存储虚拟机加载的类信息、常量、静态变量&#xff0c;以及编译器编译后的代码等数据。 程序计数器 由于在JVM中&#xff0c;多线程是通过线程轮流切换来获得CPU执行时间的&#xff0c;因此&#xff0c;在任一具体时刻&#xff0c;一个CP…...