mybatis延迟加载、缓存

news2025/1/17 11:48:13

目录

一、所需表

二、延迟加载

1.延迟加载概念

2.立即加载和延迟加载的应用场景

3.多对一延迟加载查询演示

(1)实体类

User

Account

(2)AccountMapper接口

(3)AccountMapper.xml

(4)UserMapper接口

(5)UserMapper.xml

(6)在总配置文件(mybatis-config.xml)中开启延迟加载配置

(7)测试类

(8)运行

(9)如果测试类中的输出语句改为

4.一对多延迟加载

(1)实体类

(2)UserMapper接口

(3)UserMapper.xml文件

(4)AccountMapper接口

(5)AccountMapper.xml文件

(6)在总配置文件中开启延迟加载

(7)测试类

(8)运行

三、mybatis框架的缓存

1.概念

2.一级缓存

(1)验证一级缓存的存在

测试类

运行

(2)一级缓存失效的四种情况

①使用不同的sqlSession对象查询

测试类

运行

②使用相同的sqlSession对象进行查询,但是查询条件不同

测试类

 运行

③使用相同的sqlSession对象进行查询,但是在两次执行中间我们进行了一次增删改操作

UserMapper接口

UserMapper.xml

测试类

运行

④使用相同的sqlSession对象进行查询,但是手动清除了缓存

测试类

运行

3.二级缓存

(1)在总配置文件中开启二级缓存

(2)在映射配置文件中配置

(3)实体类实现序列化接口

(4)二级缓存必须在SqlSession关闭或提交之后

(5)证明二级缓存

测试类

运行:


一、所需表

account

user

二、延迟加载

1.延迟加载概念

立即加载:当前查询用户的时候,默认把该用户所拥有的账户信息查询出来了

延迟加载:当前查询用户的时候,没有把该用户所拥有的账户信息查询出来,而是使用账户数据的时候,再去查询账户的数据

2.立即加载和延迟加载的应用场景

(1)查询账户的时候,可以直接把用户查询出来(多对一),这个时候可以选择立即加载

(2)查询用户的时候,可以先不查账户信息,需要账户信息的时候再去查,这时选择延迟加载

3.多对一延迟加载查询演示

(1)实体类

User
package com.qcby.pojo;

import java.util.Date;

/*
* 一
* */
public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public User() {
    }

    public User(Integer id, String username, Date birthday, String sex, String address) {
        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
Account
package com.qcby.pojo;

/*
* 多
* */
public class Account {
    private Integer id;
    private String money;
    private Integer uid;

    //多对一
    private User user;

    public Account() {
    }

    public Account(Integer id, String money, Integer uid, User user) {
        this.id = id;
        this.money = money;
        this.uid = uid;
        this.user = user;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getMoney() {
        return money;
    }

    public void setMoney(String money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", money='" + money + '\'' +
                ", uid=" + uid +
                ", user=" + user +
                '}';
    }
}

(2)AccountMapper接口

package com.qcby.mapper;

import com.qcby.pojo.Account;

import java.util.List;

public interface AccountMapper {
    
    /*
    * 多对一:
    * 查询所有
    * */
    public List<Account> findAll();
}

(3)AccountMapper.xml

在 <association> 标签中,需要指定一个 column 属性,这个属性的值应该是 account 表中用来关联 user 表的外键列名: column="uid"

<?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.qcby.mapper.AccountMapper"> <!--对谁进行操作就写谁-->

    <!--多对一:-->
    <!--查询所有:public List<Account> findAll();-->
    <select id="findAll" resultMap="accountMap">
        select * from account
    </select>
    <resultMap id="accountMap" type="account">
        <id property="id" column="id"/>
        <result property="money" column="money"/>
        <result property="uid" column="uid"/>
        <!--配置延迟加载-->
        <association property="user" column="uid" javaType="user" select="com.qcby.mapper.UserMapper.findById">
            <id column="id" property="uid"/>
            <result column="username" property="username"/>
            <result column="birthday" property="birthday"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>
</mapper>

(4)UserMapper接口

package com.qcby.mapper;

import com.qcby.pojo.User;

public interface UserMapper {
    
    /*
    * 多对一:
    * 根据id查询
    * */
    public User findById(Integer id);
}

(5)UserMapper.xml

<?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.qcby.mapper.UserMapper"> <!--对谁进行操作就写谁-->

    <!--多对一-->
    <!--根据id查询:public User findById(Integer id);-->
    <select id="findById" parameterType="int" resultType="user">
        select * from user where id=#{id}
    </select>
</mapper>

(6)在总配置文件(mybatis-config.xml)中开启延迟加载配置

mybatis-config.xml

<settings>
    <!--开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--将积极加载改为消极加载及按需加载-->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

(7)测试类

package com.qcby.test;

import com.qcby.mapper.AccountMapper;
import com.qcby.mapper.UserMapper;
import com.qcby.pojo.Account;
import com.qcby.pojo.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class demo {
    private InputStream inputStream;
    private SqlSession sqlSession;
    private AccountMapper accountMapper;
    private UserMapper userMapper;
    @Before
    public void init() throws IOException {
        //加载配置文件
        inputStream= Resources.getResourceAsStream("mybatis-config.xml");
        //创建工厂对象
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //创建session对象
        sqlSession=sqlSessionFactory.openSession();
        //获取到代理对象
        userMapper=sqlSession.getMapper(UserMapper.class);
        accountMapper=sqlSession.getMapper(AccountMapper.class);
    }

    /*
    * 多对一:
    * account查询所有
    * */
    @Test
    public void findAllTest(){
        List<Account> accounts=accountMapper.findAll();
        for (Account account:accounts){
            //System.out.println("开始...");
            System.out.println(account.getMoney());
            //System.out.println("结束...");
            System.out.println("--------------------");
        }
    }




    @After
    public void destory() throws IOException {
        inputStream.close();
        sqlSession.close();
    }
}

(8)运行

可以看到此时是没有加载出来用户的信息的

(9)如果测试类中的输出语句改为

System.out.println(account.getUser().getUsername());

再运行:

可以看到此时执行了user根据id查询的sql语句

4.一对多延迟加载

(1)实体类

User类

package com.qcby.pojo;

import java.util.Date;
import java.util.List;

/*
* 一
* */
public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    
    /*一对多*/
    private List<Account> accounts;

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                ", accounts=" + accounts +
                '}';
    }
}

(2)UserMapper接口

/*
* 一对多:
* 查询所有
* */
public List<User> findUserAll();

(3)UserMapper.xml文件

<!--一对多-->
<!--查询所有:public List<User> findUserAll();-->
<select id="findUserAll" resultMap="userMap">
    select * from user
</select>
<resultMap id="userMap" type="user">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="birthday" column="birthday"/>
    <result property="sex" column="sex"/>
    <result property="address" column="address"/>
    <collection property="accounts" column="id" ofType="account" select="com.qcby.mapper.AccountMapper.findAccountById">
        <id column="id" property="id"/>
        <result column="money" property="money"/>
        <result column="uid" property="uid"/>
    </collection>
</resultMap>

(4)AccountMapper接口

/*
* 一对多:
* 根据id查询
* */
public Account findAccountById(Integer id);

(5)AccountMapper.xml文件

<!--一对多-->
<!--根据id查询:public Account findAccountById(Integer id);-->
<select id="findAccountById" parameterType="int" resultType="account">
    select * from account where id=#{id}
</select>

(6)在总配置文件中开启延迟加载

<settings>
    <!--开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--将积极加载改为消极加载及按需加载-->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

(7)测试类

/*
* 一对多:
* user查询所有
* */
@Test
public void findUserAllTest(){
    List<User> users=userMapper.findUserAll();
    for (User user:users){
        System.out.println(user.getUsername()+"  "+user.getAddress());
        System.out.println("--------------------");
    }
}

(8)运行

三、mybatis框架的缓存

1.概念

经常需要查询,不需要修改的数据,不特别重要的数据都可以存储到缓存中

2.一级缓存

①mybatis的一级缓存是SqlSession的缓存

②查询的时候,先从SqlSession的缓存中查找,如果有,直接返回,如果没有,再去查询数据库

(1)验证一级缓存的存在

查询两次,查看结果

查询的语句在多对一查询的时候写过了

测试类
/*
* 验证一级缓存的存在
* */
@Test
public void findUserByIdTest(){
    User user1=userMapper.findById(1);
    System.out.println(user1);
    User user2=userMapper.findById(1);
    System.out.println(user2);
}
运行

(2)一级缓存失效的四种情况

①使用不同的sqlSession对象查询
测试类
package com.qcby.test;

import com.qcby.mapper.AccountMapper;
import com.qcby.mapper.UserMapper;
import com.qcby.pojo.Account;
import com.qcby.pojo.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class demo {
    private InputStream inputStream;
    private SqlSession sqlSession;
    private SqlSession sqlSession2;
    private AccountMapper accountMapper;
    private UserMapper userMapper;
    private UserMapper userMapper2;
    @Before
    public void init() throws IOException {
        //加载配置文件
        inputStream= Resources.getResourceAsStream("mybatis-config.xml");
        //创建工厂对象
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //创建session对象
        sqlSession=sqlSessionFactory.openSession();
        sqlSession2=sqlSessionFactory.openSession();
        //获取到代理对象
        userMapper=sqlSession.getMapper(UserMapper.class);
        userMapper2=sqlSession2.getMapper(UserMapper.class);
        accountMapper=sqlSession.getMapper(AccountMapper.class);
    }

 

    /*
     * 一级缓存失效的四种情况:
     * 1.使用不同的sqlSession对象进行查询
     * */
    @Test
    public void findUserByIdTest1(){
        User user1=userMapper.findById(1);
        System.out.println(user1);
        User user2=userMapper2.findById(1);
        System.out.println(user2);
    }

    @After
    public void destory() throws IOException {
        inputStream.close();
        sqlSession.close();
    }
}
运行

②使用相同的sqlSession对象进行查询,但是查询条件不同
测试类
/*
 * 一级缓存失效的四种情况:
 * 2.使用相同的sqlSession对象进行查询,但是查询条件不同
 * */
@Test
public void findUserByIdTest2(){
    User user1=userMapper.findById(1);
    System.out.println(user1);
    User user2=userMapper.findById(2);
    System.out.println(user2);
}
 运行

③使用相同的sqlSession对象进行查询,但是在两次执行中间我们进行了一次增删改操作
UserMapper接口
/*
* 根据id删除
* */
public int deleteById(Integer id);
UserMapper.xml
<!--根据id删除:public int deleteById(Integer id);-->
<delete id="deleteById" parameterType="int">
    delete from user where id=#{id}
</delete>
测试类
/*
 * 一级缓存失效的四种情况:
 * 3.使用相同的sqlSession对象进行查询,但是在两次执行中间我们进行了一次增删改操作
 * */
@Test
public void findUserByIdTest3(){
    User user1= userMapper.findById(1);
    System.out.println(user1);
    userMapper.deleteById(3);
    sqlSession.commit();
    User user2=userMapper.findById(1);
    System.out.println(user2);
}
运行

④使用相同的sqlSession对象进行查询,但是手动清除了缓存
测试类
/*
 * 一级缓存失效的四种情况:
 *  4.使用相同的sqlSession对象进行查询,但是手动清除了缓存
 * */
@Test
public void findUserByIdTest4(){
    User user1=userMapper.findById(1);
    System.out.println(user1);
    sqlSession.clearCache();//手动清理缓存
    User user2=userMapper.findById(1);
    System.out.println(user2);
}
运行

3.二级缓存

二级缓存是SqlSessionFactory级别的

(1)在总配置文件中开启二级缓存

<!--开启二级缓存-->
<settings>
    <setting name="cacheEnabled" value="true"/>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

(2)在映射配置文件中配置<cache>

(3)实体类实现序列化接口

(4)二级缓存必须在SqlSession关闭或提交之后

(5)证明二级缓存

二级缓存的适用对象地址不同,但是也从缓存加载,二级缓存存储的是零散数据,是组装出来的对象

测试类
package com.qcby.test;

import com.qcby.mapper.UserMapper;
import com.qcby.pojo.User;
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 org.junit.Test;

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

public class demo2 {

    @Test
    public void test() throws IOException {
        //加载配置文件
        InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xml");
        //创建工厂对象
        SqlSessionFactory sqlSessionFactory=new     SqlSessionFactoryBuilder().build(inputStream);

        //创建session对象
        SqlSession sqlSession1=sqlSessionFactory.openSession();
        //获取到代理对象
        UserMapper userMapper1=sqlSession1.getMapper(UserMapper.class);
        //调用方法
        User user1=userMapper1.findById(1);
        System.out.println(user1);
        System.out.println("-----------");
        //手动清理缓存
        sqlSession1.clearCache();
        sqlSession1.commit();
        sqlSession1.close();


        SqlSession sqlSession2=sqlSessionFactory.openSession();
        UserMapper userMapper2=sqlSession2.getMapper(UserMapper.class);
        User user2=userMapper2.findById(1);
        System.out.println(user2);
        sqlSession2.close();
        inputStream.close();

    }
}
运行:

可以看出,sql语句只执行了一次,说明它是查的缓存,但是地址不一样,因为他从缓存里组装出来的

 

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

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

相关文章

VIVADO FIFO (同步和异步) IP 核详细使用配置步骤

VIVADO FIFO (同步和异步) IP 核详细使用配置步骤 目录 前言 一、同步FIFO的使用 1、配置 2、仿真 二、异步FIFO的使用 1、配置 2、仿真 前言 在系统设计中&#xff0c;利用FIFO&#xff08;first in first out&#xff09;进行数据处理是再普遍不过的应用了&#xff0c…

一、1-2 5G-A通感融合基站产品及开通

1、通感融合定义和场景&#xff08;阅读&#xff09; 1.1通感融合定义 1.2通感融合应用场景 2、通感融合架构和原理&#xff08;较难&#xff0c;理解即可&#xff09; 2.1 感知方式 2.2 通感融合架构 SF&#xff08;Sensing Function&#xff09;&#xff1a;核心网感知控制…

某政务行业基于 SeaTunnel 探索数据集成平台的架构实践

分享嘉宾&#xff1a;某政务公司大数据技术经理 孟小鹏 编辑整理&#xff1a;白鲸开源 曾辉 导读&#xff1a;本篇文章将从数据集成的基础概念入手&#xff0c;解析数据割裂给企业带来的挑战&#xff0c;阐述数据集成的重要性&#xff0c;并对常见的集成场景与工具进行阐述&…

【MySQL】使用C语言链接

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;MySQL 目录 一&#xff1a;&#x1f525; MySQL connect &#x1f98b; Connector / C 使用&#x1f98b; mysql 接口介绍&#x1f98b; 完整代码样例 二&#xff1a;&#x1f525; 共勉 一&#…

《Java核心技术II》并行流

并行流 从集合中获取并行流&#xff1a;Stream paralleWords words.parallelStream(); parallel方法将任意顺序流转换为并行流&#xff1a;Stream paralleWords Stream.of(wordArray).parallel(); 以下是不好的示范&#xff0c;假设对字符串的所有短单词计数&#xff1a; …

【Rust自学】13.2. 闭包 Pt.2:闭包的类型推断和标注

13.2.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发&#xff0c;而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中&#xff0c;我们会讨论 Rust 的一…

ETW HOOK[InfinityHook]技术解析

文章目录 概述分析过程参考资料 概述 ETW是操作系统为了对系统调用、异常等信息做了一个日志操作&#xff0c;本质就是在进行调用这些中断、异常、系统调用时会走向这个代码函数区域日志保存的功能。而ETW HOOK就是在驱动层微软的PatchGuard并未对其做到很好的检测&#xff0c…

码编译安装httpd 2.4,测试

下载链接&#xff1a;https://dlcdn.apache.org/httpd/httpd-2.4.62.tar.gz [rootopenEuler-1 ~]# yum install gcc gcc-c make -y [rootopenEuler-1 ~]# ll /root total 9648 -rw-------. 1 root root 920 Jan 10 17:15 anaconda-ks.cfg -rw-r--r-- 1 root root 9872432…

步入响应式编程篇(一)

响应式编程 为什么要有响应式编程&#xff1f;响应式编程的用法Flow api的用法处理器 为什么要有响应式编程&#xff1f; 传统编码&#xff0c;操作流程常见的是命令式编程范式&#xff0c;如对于一个请求或操作来说&#xff0c;都是串行执行&#xff0c;直到异常或执行结束&a…

C++—18、C++ 中如何写类

一、类的功能阐述 今天我们将用目前学到的类的基础知识从头开始编写一个类。只编写一个基本的Log类&#xff0c;来演示到目前为止我们学过的一些基本特性。随着接下来的学习你会看到从一个类的基本版本到一个更高级版本的过程和区别。高级版本可以做同样的事情&#xff0c;但可…

SW - 查看装配图中的零件的全路径名称

文章目录 SW - 查看装配图中的零件的全路径名称概述笔记END SW - 查看装配图中的零件的全路径名称 概述 装配图中&#xff0c;如果本机有多个不同版本的同名零件(e.g. v1/p1零件, v2/p1零件)&#xff0c;在装配图中想确认是哪个版本的零件。 如果编辑错了文件&#xff0c;或者…

【开源分享】nlohmann C++ JSON解析库

文章目录 1. Nlohmann JSON 库介绍2. 编译和使用2.1 获取库2.2 包含头文件2.3 使用示例2.4 编译 3. 优势4. 缺点5. 总结参考 1. Nlohmann JSON 库介绍 Nlohmann JSON 是一个用于 C 的现代 JSON 库&#xff0c;由 Niels Lohmann 开发。它以易用性和高性能著称&#xff0c;支持 …

神经网络基础-正则化方法

文章目录 1. 什么是正则化2. 正则化方法2.1 Dropout正则化2.2 批量归一化(BN层) 学习目标&#xff1a; 知道正则化的作用掌握随机失活 DropOut 策略知道 BN 层的作用 1. 什么是正则化 在设计机器学习算法时希望在新样本上的泛化能力强。许多机器学习算法都采用相关的策略来减小…

【C++】面试题整理(未完待续)

【C】面试题整理 文章目录 一、概述二、C基础2.1 - 指针在 32 位和 64 位系统中的长度2.2 - 数组和指针2.3 - 结构体对齐补齐2.4 - 头文件包含2.5 - 堆和栈的区别2.6 - 宏函数比较两个数值的大小2.7 - 冒泡排序2.8 - 菱形继承的内存布局2.9 - 继承重写2.10 - 如何禁止类在栈上分…

ASP.NET Core - 依赖注入(四)

ASP.NET Core - 依赖注入&#xff08;四&#xff09; 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件&#xff0c;实际上一个中间件要正常进行工作&#xff0c;通常需要许多的服务配合进行&#xff0c;而中间件中的服务自然也是通过 Ioc…

w~Transformer~合集11

我自己的原文哦~ https://blog.51cto.com/whaosoft/12472192 #LightSeq 最高加速9倍&#xff01;字节跳动开源8比特混合精度Transformer引擎,近年来&#xff0c;Transformer 已经成为了 NLP 和 CV 等领域的主流模型&#xff0c;但庞大的模型参数限制了它的高效训练和推理。…

海云安开发者安全智能助手D10荣膺 “ AI标杆产品 ” 称号,首席科学家齐大伟博士入选2024年度 “ 十大杰出青年 ”

2024年12月27日&#xff0c;粤港澳大湾区AI领袖峰会在深圳成功举办&#xff0c;大会表彰了在人工智能技术创新、应用实践和产业发展等方面取得优异成绩的企业和个人&#xff0c;深圳海云安网络安全技术有限公司开发者安全智能助手D10荣膺“AI标杆产品”称号。同时&#xff0c;公…

Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件

通过 SSH 隧道将远程端口转发到本地机器 输入服务器示例的SSH指令和密码&#xff0c;将远程的6006端口代理到本地 在服务器终端&#xff0c;激活conda虚拟环境 conda activate posecnnexport PYOPENGL_PLATFORMegljupyter notebook --no-browser --port6006 --allow-root从…

网站建设公司哪家好?我的避坑指南

公司刚成立那个时候&#xff0c;第一步就是想着抓紧做一个官网&#xff0c;因为一个好的网站可以通过互联网源源不断的带来客流&#xff0c;所以小公司业务最重要&#xff0c;我就赶紧在网上开始找公司。 网站是的大活&#xff0c;对于我这种什么都不会的&#xff0c;当然只能…

浅谈云计算15 | 存储可靠性技术(RAID)

存储可靠性技术 一、存储可靠性需求1.1 数据完整性1.2 数据可用性1.3 故障容错性 二、传统RAID技术剖析2.1 RAID 02.2 RAID 12.3 RAID 52.4 RAID 62.5 RAID 10 三、RAID 2.0技术3.1 RAID 2.0技术原理3.1.1 两层虚拟化管理模式3.1.2 数据分布与重构 3.2 RAID 2.0技术优势3.2.1 自…