MyBatis之缓存机制

news2024/11/23 3:44:45

缓存即为存在内存中的临时数据.将用户经常查询的数据存放在缓存(内存)中,用户去查询数据就不用去每次去数据库中查询,而是去缓存中查询,从而提高了查询的效率,解决了高并发系统的性能问题.MyBatis提供了两种缓存机制:一级缓存(本地)和二级缓存(全局)
1、默认情况下,只有一级缓存( SqlSession级别的缓存也称为本地缓存)开启。
2、二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
3、为了提高扩展性。MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存

1. 基础环境

1.1 数据库准备

USE mybatis;
# 创建一个名称为tb_book的表
CREATE TABLE  tb_book( 
     id INT PRIMARY KEY AUTO_INCREMENT,
     name VARCHAR(255),
     price double,
     author VARCHAR(40)   
);
# 插入3条数据
INSERT INTO tb_book(name,price,author) VALUES('Java基础入门',45.0,'Liy');
INSERT INTO tb_book(name,price,author) VALUES('Java基础案例教程',48.0,'Tom');
INSERT INTO tb_book(name,price,author) VALUES('JavaWeb程序设计任务教程',50.0,'Jack');

1.2 Idea环境搭建

1.2.1 创建一个cache的module

在这里插入图片描述

1.2.2 在pom.xml中引入所需要的包

mybatis, mysql-connector-java, junit, log4j, lombok

<?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">
    <parent>
        <artifactId>mybatis-series</artifactId>
        <groupId>com.biem</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cache</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
    </dependencies>
</project>

1.2.3 创建包:com.biem.pojo, com.biem.mapper, com.biem.util

在这里插入图片描述

1.2.4 在resource下添加配置文件

1.2.4.1 添加配置文件jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
jdbc.username=root
jdbc.password=root

1.2.4.2 添加配置文件log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n"/>
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug"/>
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info"/>
    </logger>
    <root>
        <level value="debug"/>
        <appender-ref ref="STDOUT"/>
    </root>
</log4j:configuration>

1.2.4.3 添加MyBatis的核心配置类mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--引入properties文件-->
    <properties resource="jdbc.properties"></properties>

    <!--将下划线映射为驼峰-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--设置类型别名-->
    <typeAliases>
        <package name="com.biem.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

    </environments>

    <!-- 引入映射文件 -->
    <mappers>
        <package name="com.biem.mapper"/>
    </mappers>
    
</configuration>

1.2.4.4 创建映射文件所在的目录

在这里插入图片描述

1.2.5 添加工具类com.biem.util.MyBatisUtil.java

package com.biem.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 * ClassName: MybatisUtil
 * Package: com.biem.util
 * Description:
 *
 * @Create 2023/4/5 22:23
 * @Version 1.0
 */
public class MyBatisUtil {
    //利用static(静态)属于类不属于对象,且全局唯一
    private static SqlSessionFactory sqlSessionFactory = null;
    //利用静态块在初始化类时实例化sqlSessionFactory
    static {
        InputStream is= null;
        try {
            is = Resources.getResourceAsStream("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }

    /**
     * openSession 创建一个新的SqlSession对象
     * @return SqlSession对象
     */
    public static SqlSession openSession(boolean autoCommit){
        return sqlSessionFactory.openSession(autoCommit);
    }

    public static SqlSession openSession(){
        return sqlSessionFactory.openSession();
    }
    /**
     * 释放一个有效的SqlSession对象
     * @param session 准备释放SqlSession对象
     */
    public static void closeSession(SqlSession session){
        if(session != null){
            session.close();
        }
    }
}

1.2.6 实体类com.biem.pojo.Book.java

package com.biem.pojo;

import lombok.*;

/**
 * ClassName: Book
 * Package: com.biem.pojo
 * Description:
 *
 * @Create 2023/5/18 7:58
 * @Version 1.0
 */
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    private Integer id;
    private String name;
    private Integer price;
    private String author;
}

1.2.7 mapper接口

package com.biem.mapper;

/**
 * ClassName: BookMapper
 * Package: com.biem.mapper
 * Description:
 *
 * @Create 2023/5/18 8:01
 * @Version 1.0
 */
public interface BookMapper {
}

1.2.7 mapper映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.biem.mapper.BookMapper">
    <!-- sql语句要和接口的方法名保持一致 -->

</mapper>

2. 一级缓存(本地)

MyBatis的一级缓存是SqlSession级别的缓存。
如果同一个SqlSession对象多次执行完全相同的SQL语句,在第一次执行完成后,MyBatis会将查询的结果写入到一级缓存中。此后如果程序没有执行插入、更新、删除操作。当第二次执行相同的查询语句时,MyBatis会直接读取一级缓存中的数据,而不在去数据库查询,从而提高了数据库的查询效率。
测试案例1:
从数据库tb_book查询id为1的图书信息的时候,当第一次查询后会将结果写入MyBatis的一级缓存,当程序第二次查询id为1的图书信息,MyBatis会直接从一级缓存中读取。

2.1 接口添加方法

package com.biem.mapper;

import com.biem.pojo.Book;

public interface BookMapper {
    public Book findBookById(Integer id);
}

2.2 映射文件添加实现

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.biem.mapper.BookMapper">
    <!-- sql语句要和接口的方法名保持一致 -->
    <!--public Book findBookById(Integer id);-->
    <select id="findBookById" parameterType="Integer" resultType="Book">
        select * from tb_book where id=#{id}
    </select>
</mapper>

2.3 测试方法

package com.biem.test;

import com.biem.mapper.BookMapper;
import com.biem.pojo.Book;
import com.biem.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

/**
 * ClassName: UserTest
 * Package: com.biem.test
 * Description:
 *
 * @Create 2023/5/18 8:44
 * @Version 1.0
 */
public class UserTest {
    @Test
    public void findBookById(){
        SqlSession session = MyBatisUtil.openSession();
        BookMapper mapper = session.getMapper(BookMapper.class);
        Book book = mapper.findBookById(1);
        System.out.println("book = " + book);
        session.close();
    }

    @Test
    public void testCache1(){
        SqlSession session = MyBatisUtil.openSession();
        BookMapper mapper1 = session.getMapper(BookMapper.class);
        Book book1 = mapper1.findBookById(1);
        System.out.println("book1 = " + book1);

        BookMapper mapper2 = session.getMapper(BookMapper.class);
        Book book2 = mapper2.findBookById(1);
        System.out.println("book1 = " + book2);
        session.close();
    }
}

2.4 结果分析

findBookById输出如下:

DEBUG 05-18 09:07:47,909 ==>  Preparing: select * from tb_book where id=? (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:07:47,986 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:07:48,047 <==      Total: 1 (BaseJdbcLogger.java:137) 
book = Book(id=1, name=Java基础入门, price=45, author=Liy)

testCache1输出如下

DEBUG 05-18 09:07:48,056 ==>  Preparing: select * from tb_book where id=? (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:07:48,057 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:07:48,059 <==      Total: 1 (BaseJdbcLogger.java:137) 
book1 = Book(id=1, name=Java基础入门, price=45, author=Liy)
book1 = Book(id=1, name=Java基础入门, price=45, author=Liy)

从上述输出可以看出testCache1只是查询了一次,第二次查询的时候并没有连接数据库
testCache1fail输出如下

DEBUG 05-18 09:14:30,875 ==>  Preparing: select * from tb_book where id=? (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:14:30,953 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:14:31,015 <==      Total: 1 (BaseJdbcLogger.java:137) 
book1 = Book(id=1, name=Java基础入门, price=45, author=Liy)
DEBUG 05-18 09:14:31,059 ==>  Preparing: select * from tb_book where id=? (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:14:31,060 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:14:31,065 <==      Total: 1 (BaseJdbcLogger.java:137) 
book1 = Book(id=1, name=Java基础入门, price=45, author=Liy)

3. 二级缓存(全局)

3.1 开启缓存前配置

3.1.1 实体类实现Serializable 接口

package com.biem.pojo;

import lombok.*;

import java.io.Serializable;


@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Book implements Serializable {
    private Integer id;
    private String name;
    private Integer price;
    private String author;
}

3.1.2 mybatis-config.xml中开启二级缓存全局配置

mybatis-config.xml中添加

    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

3.1.3 开启当前mapper下的二级缓存BookMapper.xml

BookMapper.xml添加

<cache></cache>

3.2 添加测试方法UserTest.java

    @Test
    public void testCache2_0(){
        SqlSession session1 = MyBatisUtil.openSession();
        BookMapper mapper1 = session1.getMapper(BookMapper.class);
        Book book1 = mapper1.findBookById(1);
        System.out.println("book1 = " + book1);

        SqlSession session2 = MyBatisUtil.openSession();
        BookMapper mapper2 = session2.getMapper(BookMapper.class);
        Book book2 = mapper2.findBookById(1);
        System.out.println("book1 = " + book2);
        session1.close();
        session2.close();
    }

    @Test
    public void testCache2_1(){
        SqlSession session1 = MyBatisUtil.openSession();
        BookMapper mapper1 = session1.getMapper(BookMapper.class);
        Book book1 = mapper1.findBookById(1);
        System.out.println("book1 = " + book1);
        session1.close();

        SqlSession session2 = MyBatisUtil.openSession();
        BookMapper mapper2 = session2.getMapper(BookMapper.class);
        Book book2 = mapper2.findBookById(1);
        System.out.println("book1 = " + book2);
        session2.close();
    }

3.3结果分析

testCache2_1进行了一次查询,结果如下:

DEBUG 05-18 09:40:00,228 Cache Hit Ratio [com.biem.mapper.BookMapper]: 0.0 (LoggingCache.java:60) 
DEBUG 05-18 09:40:02,793 ==>  Preparing: select * from tb_book where id=? (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:40:02,867 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:40:02,944 <==      Total: 1 (BaseJdbcLogger.java:137) 
book1 = Book(id=1, name=Java基础入门, price=45, author=Liy)
WARN  05-18 09:40:02,960 As you are using functionality that deserializes object streams, it is recommended to define the JEP-290 serial filter. Please refer to https://docs.oracle.com/pls/topic/lookup?ctx=javase15&id=GUID-8296D8E8-2B93-4B9A-856E-0A65AF9B8C66 (SerialFilterChecker.java:46) 
DEBUG 05-18 09:40:02,968 Cache Hit Ratio [com.biem.mapper.BookMapper]: 0.5 (LoggingCache.java:60) 
book1 = Book(id=1, name=Java基础入门, price=45, author=Liy)

testCache2_2进行了一次查询,结果如下:

DEBUG 05-18 09:41:38,669 Cache Hit Ratio [com.biem.mapper.BookMapper]: 0.0 (LoggingCache.java:60) 
DEBUG 05-18 09:41:41,356 ==>  Preparing: select * from tb_book where id=? (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:41:41,433 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:41:41,504 <==      Total: 1 (BaseJdbcLogger.java:137) 
book1 = Book(id=1, name=Java基础入门, price=45, author=Liy)
WARN  05-18 09:41:41,523 As you are using functionality that deserializes object streams, it is recommended to define the JEP-290 serial filter. Please refer to https://docs.oracle.com/pls/topic/lookup?ctx=javase15&id=GUID-8296D8E8-2B93-4B9A-856E-0A65AF9B8C66 (SerialFilterChecker.java:46) 
DEBUG 05-18 09:41:41,529 Cache Hit Ratio [com.biem.mapper.BookMapper]: 0.5 (LoggingCache.java:60) 
book2 = Book(id=1, name=Java基础入门, price=45, author=Liy)
DEBUG 05-18 09:41:41,531 Cache Hit Ratio [com.biem.mapper.BookMapper]: 0.6666666666666666 (LoggingCache.java:60) 
book3 = Book(id=1, name=Java基础入门, price=45, author=Liy)

testCache2_0和testCache1一样的内容,输出结果如下:

DEBUG 05-18 09:39:11,470 Cache Hit Ratio [com.biem.mapper.BookMapper]: 0.0 (LoggingCache.java:60) 
DEBUG 05-18 09:39:14,368 ==>  Preparing: select * from tb_book where id=? (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:39:14,501 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:39:14,567 <==      Total: 1 (BaseJdbcLogger.java:137) 
book1 = Book(id=1, name=Java基础入门, price=45, author=Liy)
DEBUG 05-18 09:39:14,580 Cache Hit Ratio [com.biem.mapper.BookMapper]: 0.0 (LoggingCache.java:60) 
DEBUG 05-18 09:39:14,656 ==>  Preparing: select * from tb_book where id=? (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:39:14,656 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:137) 
DEBUG 05-18 09:39:14,659 <==      Total: 1 (BaseJdbcLogger.java:137) 
book1 = Book(id=1, name=Java基础入门, price=45, author=Liy)

testCache2_0依然进行了两次查询,session.close()执行之前并没有刷新缓存。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

thinkphp6 消息队列think-queue(完整版)

1.安装队列依赖 如果是在Linux上&#xff0c;进入thinkphp项目的think文件所在目录&#xff0c;执行安装命令 composer require topthink/think-queue 2.修改queue的配置文件&#xff0c;文件位置config/queue.php(安装成功后自动生成) <?php return [default >…

Python实现ACO蚁群优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

Layui layer 弹出层的使用【笔记】

Layui layer 弹出层的使用 首先&#xff0c;为了方便直接通过在线cdn引入对应的css和js <!-- 引入 layui.css --> <link href"//unpkg.com/layui2.8.0/dist/css/layui.css" rel"stylesheet"> <!-- 引入 layui.js --> <script src&…

来自非985211的普通本科的Android面试题分享【网络安全】

文中附有详细的面试真题目&#xff0c;文末有我当时刷的面试真题还有一些对我帮助良多的复习资料&#xff0c;特别有用&#xff0c;希望也可以帮大家顺利上岸&#xff0c;顺便攒攒人品&#xff01; 个人的基本情况 本人出生在一个普通家庭&#xff0c;自身学历很一般&#xff…

现在的00后,真是卷死了呀,辞职信已经写好了·····

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;三月份春招我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪23K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

【taro react】---- 解决开发环境微信小程序由于主包体积过大不能预览问题

1. 开发环境代码包大小 注意:可以看到此时主包加分包将近 5MB,上传预览将会超出限制!!! 2. 预览结果 报错:代码包大小超过限制,主包资源近3MB,限制最大2MB!!! 3. 解决办法 使用webpack的压缩插件,在开发环境编译的时候进行压缩;进行分包处理,同时依赖也进行分包处…

冲刺618:新品变爆品,品牌如何提炼差异化卖点?

纵观2023年品牌生态&#xff0c;大牌强势、新锐崛起。618大促将至&#xff0c;当前市场营销内容同质化严重&#xff0c;如何占领用户心智&#xff0c;成为品牌营销的“考题”之一。千瓜&#xff5c;谦果营销 结合小红书品牌推广实操经验&#xff0c;沉淀总结品牌差异化卖点提炼…

OpenText Exceed TurboX 桌面虚拟化解决方案整合数据中心、提供高端图形显示

突出特点 2D 和 3D 图形应用程序的卓越性能远程访问&#xff1b; 全球团队的强大协作&#xff1b; 高级安全和集中管理&#xff1b; 从 MicrosoftWindows、Mac、Linux 或 iPad 远程访问。 企业正在寻求整合数据中心&#xff0c;达到减少 IT 支出并提高中央可管理性的目的。 同…

决策反馈均衡器介绍

参考链接&#xff1a;https://www.163.com/dy/article/GK6BBSEB0531PW97.html https://zhuanlan.zhihu.com/p/477141677 DFE全称为Decision Feedback Equalizer&#xff0c;即决策反馈均衡器。它是一种电信通信系统中常用的均衡器&#xff0c;在接收信号端实现等化器、滤波器和…

Selenium入门必备:学会用代码控制浏览器,打开网页、找到元素和退出浏览器

目录 一、前期准备 1、概述 2、学习目标 3、安装 二、selenium的基本使用 1、加载网页&#xff1a; 2、定位和操作&#xff1a; 3、查看请求信息&#xff1a; 4、退出 小结 三、元素定位的方法 学习目标 1、selenium的定位操作 2、元素的操作 小结 四、seleniu…

ThingsBoard 场景联动需求

0、需求 1、概述 当初有个兄弟请我帮他实现一个需求,需求如上,很简单,实现完成后我怕他操作不来,又写了这份文档给他,今天把这个文档的场景发出来,大家也可以学习一下思路 2、登录账号 系统层: 账号:sysadmin@thingsboard.org 密码:sysadmin 3、创建租户 新建租户…

MS COCO数据集介绍

MS COCO数据集介绍 MS COCO全称是Microsoft Common Objects in Context&#xff0c;是由微软开发维护的大型图像数据集&#xff0c;包括不同检测任务&#xff1a; Object Detection&#xff08;[主要处理人、车、大象等]&#xff09; DensePose&#xff08;姿态密度检测&…

12个超好用的免费在线工具,大大提高生产力,建议收藏!

好的工具&#xff0c;能够帮助我们更高效地完成工作&#xff0c;节省时间和精力; 节省出更多的摸鱼时间&#xff01; 本文将介绍12款绝佳的免费效率工具&#xff0c;这些工具可以让你事半功倍&#xff0c;提高工作效率。无论你是一名程序员、设计师、学生还是白领&#xff0c;…

超级秘密文件夹忘记密码的解决办法

超级秘密文件夹是一款非常特殊的文件夹加密软件&#xff0c;它来无影去无踪&#xff0c;在安装后不会留下任何痕迹&#xff0c;只能通过软件热键才能打开。那么如果在使用过程中忘记了密码&#xff0c;这时我们该怎么办呢&#xff1f;下面我们就来了解一下。 首先&#xff0c;我…

【历史上的今天】5 月 18 日:微软反垄断诉讼;携程旅行网上线;谷歌首次公布 TPU

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 5 月 18 日&#xff0c;在 1939 年的今天&#xff0c;彼得格伦伯格&#xff08;Peter Grunberg&#xff09;出生。格伦伯格是一名德国物理学家&#xff0c;是诺…

【jvm系列-12】jvm性能调优篇---GUI工具的基本使用

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

五分钟学会Playwright录制脚本的方法以及语法难点

这篇文章系统地介绍了上手Playwright的方法&#xff0c;但是录制脚本部分讲解不够详尽&#xff0c;今天我在这里重点的介绍一下Playwright 录制脚本的方法来丰满我的Playwright系列技术文章。 Playwright可以使用codegen来录制脚本&#xff0c;使用方式非常简单&#xff0c;只…

Windows 安全基础

Windows 隐藏账号 命令行输入以下命令&#xff0c;可以进行简单的隐藏&#xff08;命令行下不可见&#xff09; net user test$ 123456 /add net localgroup administrators test$ /add 通过注册表隐藏用户&#xff08;实现步骤如下&#xff09;&#xff1a; 要实现很好的…

文生图关键问题探索:个性化定制和效果评价

文生图&#xff08;Text-to-Image Generation&#xff09;是AIGC&#xff08;AI Generated Content&#xff0c;人工智能生成内容&#xff09;的一个主要方向。近年来&#xff0c;文生图模型的效果和质量得到飞速提升&#xff0c;投资界和研究界都在密切关注文生图模型的进展。…

二苯基环辛炔-生物素,DBCO-Biotin点击化学DBCO生物素;CAS:1418217-95-4

中文名称&#xff1a;二苯并环辛炔-生物素 英文名称&#xff1a;DBCO-Biotin CAS&#xff1a;1418217-95-4 分子式&#xff1a;C28H30N4O3S 分子量&#xff1a;502.63 性状&#xff1a;固体粉末 保存方法&#xff1a;-20℃避光避湿保存 点击化学DBCO发生在水中&#xff…