02020503 EF Core高级03-分页查询、IQuerable底层的实现形式、DataReader、DataTable、EF Core中的异步方法

news/2025/10/6 11:16:46/文章来源:https://www.cnblogs.com/python-web/p/19127421

02020503 EF Core高级03-分页查询、IQuerable底层的实现形式、DataReader、DataTable、EF Core中的异步方法

1. EF Core分页查询(视频3-27)

1.1 分页查询的实现
1、Skip(3).Take(8) 最好显式指定排序规则,Skip表示跳过多少条数据,Take表示取几条数据。
2、需要知道满足条件的数据的总条数:用IQueryable的复用
LongCount和Count
3、页数:long pageCount = (long)Math.Ceiling(count * 1.0 / pageSize);
1.2 查看int和long类型的数据范围
using System;
using System.Linq;namespace OneToMany
{class Program{static void Main(string[] args){Console.WriteLine(int.MaxValue);Console.WriteLine(long.MaxValue);}}
}控制台输出:
2147483647
9223372036854775807
1.3 分页查询示例
  • 在02020409章5.2节基础上继续
// 数据库中Articles表添加如下数据
Id	Title	Message	Price
1	杨中科入选中科院	大新闻	0
2	微软发布.NET 10.0	中新闻	0
3	微软发射微星	小新闻	0
4	中国发射小行星探测器	劲爆新闻	0
5	111	111	0
8	222	222	0
9	333	333	0
10	444	444	0
11	555	555	555
12	666	666	0
13	777	777	0
14	888	888	0
15	999	999	0
16	1010	1010	0
17	1111	1111	0
18	12121	1212	0
19	1313	1313	0
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Program.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;namespace OneToMany
{class Program{static void Main(string[] args){PrintPage(1, 3); // 取第一页,每页3条。Console.WriteLine("********************");PrintPage(3, 3); // 取第三页,每页3条。Console.ReadLine();}/// <summary>/// 打印某一页数据,同时打印总页数/// </summary>/// <param name="pageIndex">页码(从1开始)</param>/// <param name="pageSize">每一页展示的条数</param>static void PrintPage(int pageIndex, int pageSize){using (MyDbContext ctx = new MyDbContext()){IQueryable<Article> arts = ctx.Articles.Where(a => !a.Title.Contains("杨中科")); // 取出所有Title中不含有杨中科的数据var items = arts.Skip((pageIndex - 1) * pageSize).Take(pageSize);foreach (var item in items){Console.WriteLine(item.Title);}long Count = arts.LongCount(); // Celling表示取天花板,1.1取2。乘以1.0为了转为小数运算。long pageCount = (long)Math.Ceiling(Count * 1.0 / pageSize);Console.WriteLine("总页数" + pageCount);}}}
}控制台输出:
微软发布.NET 10.0
微软发射微星
中国发射小行星探测器
总页数6
********************
444
555
666
总页数6// SQL语句
SELECT COUNT_BIG(*)FROM [T_Articles] AS [t]WHERE NOT ([t].[Title] LIKE N'%杨中科%')

2. IQuerable底层如何读取数据(视频3-28)

2.1 对比DataReader和DateTable
1、DataReader:分批从数据库服务器读取数据。内存占用小、 DB连接占用时间长;
2、DataTable:把所有数据都一次性从数据库服务器都加载到客户端内存中。内存占用大,节省DB连接。
2.2 验证IQuerable用什么方式
1、用insert into select多插入一些数据,然后加上Delay/Sleep的遍历IQueryable。在遍历执行的过程中,停止SQLServer服务器。
IQueryable内部就是在调用DataReader。
2、优点:节省客户端内存。
缺点:如果处理的慢,会长时间占用连接。

3. 验证IQuerable以DataReader形式读取数据示例

  • 在本课1.3节上继续
3.1 在数据库插入数据
SSMS → CoreDataDB → 右键 → 新建查询insert into T_Articles(Title,Message) // 插入数据
select Title,Message from T_Articles // 查询数据说明:将数据库中查询的数据插入到数据库中,这样数据库可以以指数形式增加。
3.2 代码示例
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){foreach (var item in ctx.Articles){Console.WriteLine(item.Title);Thread.Sleep(100); // 没打印一次暂停100ms}}Console.ReadLine();}}
}控制台输出:
杨中科入选中科院
微软发布.NET 10.0
微软发射微星
中国发射小行星探测器
111
222
333
444
555
666
777
... // 不断打印
3.3 关闭数据库
任务管理器 → 进程 → SQL Server VSS Writer -64 Bit → 右键 → 打开服务 → SQL Server(MSSQLSERVER) → 停止
图片链接丢失
3.4 程序抛出异常
Microsoft.Data.SqlClient.SqlException:“A transport-level error has occurred when receiving results from the server. (provider: Session Provider, error: 19 - Physical connection is not usable)”异常信息:数据库物理连接异常。
3.5 总结
  • 采用的是DataReader形式读取。分批从数据库服务器读取数据。内存占用小、 DB连接占用时间长;
  • 如果有很多读取,那么会长时间占用数据库连接。

4. 验证IQuerable以DataTable形式读取数据示例

4.1 一次性加载所有数据
1、一次性加载数据到内存:用IQueryable的ToArray()、ToArrayAsync()、ToList()、ToListAsync()等方法。
2、等ToArray()执行完毕,再断服务器试一下。
4.1 代码示例
  • 在本课3.2节上继续
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){foreach (var item in ctx.Articles.ToArray()) // 或者为foreach (var item in ctx.Articles.ToList()){Console.WriteLine(item.Title);Thread.Sleep(100); // 没打印一次暂停100ms}}Console.ReadLine();}}
}控制台输出:
杨中科入选中科院
微软发布.NET 10.0
微软发射微星
中国发射小行星探测器
111
222
333
444
555
666
777
... // 不断打印说明:此时程序会卡一下,然后开始输出。因为卡顿的时间就是在读取数据库中的所有数据。
4.2 断开数据库连接
  • 重复3.3中操作,此时程序不会抛出异常。

5. 何时需要一次性加载

5.1 一次性加载的适用性
1、场景1:遍历IQueryable并且进行数据处理的过程很耗时。
2、场景2:如果方法需要返回查询结果,并且在方法里销毁DbContext的话,是不能返回IQueryable的。必须一次性加载返回。
3、场景3:多个IQueryable的遍历嵌套。很多数据库的ADO.NET Core Provider是不支持多个DataReader同时执行的。把连接字符串中的MultipleActiveResultSets=true删掉,其他数据库不支持这个。
5.2 场景2分析
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){var items = QuerryZYK(); // @2 ctx连接用完后销毁foreach (var item in items) // @3{Console.WriteLine(item.Title);}}Console.ReadLine();}static IQueryable<Article> QuerryZYK(){using (MyDbContext ctx = new MyDbContext()){return ctx.Articles.Where(a => !a.Title.Contains("杨中科")); // @1}}}
}抛出异常:System.ObjectDisposedException:“Cannot access a disposed context instance. A common cause of this error is disposing a context instance that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling 'Dispose' on the context instance, or wrapping it in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.
ObjectDisposed_ObjectName_Name”说明:
1. 在@1处并没有查询数据库,而是在@3处使用foreach时才开始执行。而程序在@2处已经销毁了。
2. 此处即使将static IQueryable<Article> QuerryZYK()定义为static IEnumerable<Article> QuerryZYK()也不行。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){var items = QuerryZYK();foreach (var item in items){Console.WriteLine(item.Title);}}Console.ReadLine();}static IQueryable<Article> QuerryZYK(){MyDbContext ctx = new MyDbContext(); // 只调用,不销毁ctx。return ctx.Articles.Where(a => !a.Title.Contains("杨中科"));}}
}控制台输出:
微软发布.NET 10.0
微软发射微星
中国发射小行星探测器
111
...
微软发布.NET 10.0
微软发射微星
中国发射小行星探测器
...说明:此时控制台虽然能正常打印,但是不合理。因为没有销毁ctx,每调用一次就会创建ctx对象,这样会有内存泄漏的危险。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 使用一次性加载来实现
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){var items = QuerryZYK();foreach (var item in items){Console.WriteLine(item.Title);}}Console.ReadLine();}static IEnumerable<Article> QuerryZYK() // 返回IEnumerable{using (MyDbContext ctx = new MyDbContext()){return ctx.Articles.Where(a => !a.Title.Contains("杨中科")).ToArray(); // 一次性加载}}}
}控制台输出:
微软发布.NET 10.0
微软发射微星
中国发射小行星探测器
111
...
微软发布.NET 10.0
微软发射微星
中国发射小行星探测器
...说明:
1. 一次性都加载到内存中之后,再销毁ctx也不会出问题,后面的数据都是从内存中加载。
2. 通常来说,不建议方法的返回值为IQuerable,而是返回IEnumerable。
5.3 场景3分析
// MyDbContext.cs
using Microsoft.EntityFrameworkCore;
using System;namespace OneToMany
{class MyDbContext : DbContext{public DbSet<Article> Articles { get; set; }public DbSet<Comment> Comments { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string connStr = "Server=.;Database=CoreDataDB;Trusted_Connection=True"; // 去掉;MultipleActiveResultSets=trueoptionsBuilder.UseSqlServer(connStr);// optionsBuilder.LogTo(Console.WriteLine);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){foreach (var item01 in ctx.Articles) // 第一个遍历{Console.WriteLine(item01.Title);foreach (var item02 in ctx.Comments) // 第二个遍历{Console.WriteLine(item02.Message);}}Console.ReadLine();}}}
}抛出异常:System.InvalidOperationException:“There is already an open DataReader associated with this Connection which must be closed first.”说明:在ADO.NET中默认不支持多个DataReader连接的。同时遍历2个IQuerable就是遍历两个DataReader,是不支持的。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 在SQL Server中,只需要加上MultipleActiveResultSets=true就行。即允许多个活动的结果集打开(允许多个DataReader运行)。
using Microsoft.EntityFrameworkCore;
using System;namespace OneToMany
{class MyDbContext : DbContext{public DbSet<Article> Articles { get; set; }public DbSet<Comment> Comments { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string connStr = "Server=.;Database=CoreDataDB;Trusted_Connection=True;MultipleActiveResultSets=true";optionsBuilder.UseSqlServer(connStr);// optionsBuilder.LogTo(Console.WriteLine);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){foreach (var item01 in ctx.Articles) // 第一个遍历{Console.WriteLine(item01.Title);foreach (var item02 in ctx.Comments) // 第二个遍历{Console.WriteLine(item02.Message);}}Console.ReadLine();}}}
}控制台输出:
...
太牛了
微软不过如此
微软真牛
微软真水
999
太牛了
微软不过如此
微软真牛
微软真水
1010
...
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
总结:在其它数据库中,MultipleActiveResultSets=true是否支持待考证(MySQL数据库是不支持的)。
5.4 不用MultipleActiveResultSets=true配置怎么解决
// 一次性加载到内存里面,在内存里面完成遍历
using Microsoft.EntityFrameworkCore;
using System;namespace OneToMany
{class MyDbContext : DbContext{public DbSet<Article> Articles { get; set; }public DbSet<Comment> Comments { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string connStr = "Server=.;Database=CoreDataDB;Trusted_Connection=True"; // 不再配置MultipleActiveResultSets=trueoptionsBuilder.UseSqlServer(connStr);// optionsBuilder.LogTo(Console.WriteLine);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){foreach (var item01 in ctx.Articles.ToArray()) // 一次性加载{Console.WriteLine(item01.Title);foreach (var item02 in ctx.Comments.ToArray()) // 一次性加载{Console.WriteLine(item02.Message);}}Console.ReadLine();}}}
}控制台输出:
...
太牛了
微软不过如此
微软真牛
微软真水
999
太牛了
微软不过如此
微软真牛
微软真水
1010
...说明:
1. 此时内存占用会比较高,如果只是只有几十条,几百条,最多几万条是可以全部加载到内存的。如果更多,内存占用不合理。
2. 这种形式在常规业务中是用的比较多。实际开发中依据项目需求来决定。

6. EF Core中的异步方法(视频3-29)

6.1 对应的异步方法
1、SaveChanges()、SaveChangesAsync()
2、异步方法大部分是定义在Microsoft.EntityFrameworkCore这个命名空间下EntityFrameworkQueryableExtensions等类中的扩展方法,记得using。
3、AddAsync()、AddRangeAsync()、AllAsync()、AnyAsync、AverageAsync、ContainsAsync、CountAsync、FirstAsync、FirstOrDefaultAsync、ForEachAsync、LongCountAsync、MaxAsync、MinAsync、SingleAsync、SingleOrDefaultAsync、SumAsync等
6.2 非异步方法
IQueryable的这些异步的扩展方法都是“立即执行”方法,而GroupBy、OrderBy、Join、Where等“非立即执行”方法则没有对应的异步方法。为什么?因为:“非立即执行”方法并没有实际执行SQL语句,并不是消耗IO的操作。而异步方法对于耗时操作,会产生线程阻塞。总结就是:非终结方法不消耗IO。
6.3 异步遍历IQuerable
方式1、ToListAsync()、ToArrayAsync()。结果集不要太大。
方式2、await foreach (Book b in ctx.Books.AsAsyncEnumerable())不过,一般没必要这么做。比较推荐用如下同步方法写法,如果如下同步方法出现了性能瓶颈,再考虑上述两个方式。很少出现这样的情况。
foreach(var a in ctx.Articles)
{Console.WriteLine(a.Title)
}

结尾

书籍:ASP.NET Core技术内幕与项目实战

视频:https://www.bilibili.com/video/BV1pK41137He

著:杨中科

ISBN:978-7-115-58657-5

版次:第1版

发行:人民邮电出版社

※敬请购买正版书籍,侵删请联系85863947@qq.com※

※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

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

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

相关文章

02020502 EF Core高级02-IQuerable会延迟执行、分部和动态构建IQuerable、IQuerable的复用

02020502 EF Core高级02-IQuerable会延迟执行、分部和动态构建IQuerable、IQuerable的复用 1. IQuerable会延迟执行(视频3-25) 1、测试一下:只查询,但是不遍历IQueryable,查看是否有执行SQL语句。 2、在查询之后、…

在 PyCharm 中,环境:bert_env , 执行 import wandb 报错。但是,在CMD窗口,环境:bert_env , 执行 import wandb 正常。

同一个wandb包,使用相同的conda虚拟环境,在pycharm中导入失败,在command窗口中导入成功。 同一个ssl包,使用相同的conda虚拟环境,在pycharm中导入失败,在command窗口中导入成功。在 PyCharm 中,环境:bert_env …

设计网站排行北京有哪些网站建设公司

[html] 当html中使用map标签时,area中coords值如何精确定位呢&#xff1f; 在 area 标签上支持的属性有 shape、coords、href、alt、target、type、download、hreflang、media、rel&#xff1b; coords 值如何精确定位圆形&#xff0c;在绘制一个圆形时&#xff0c;其 shapeci…

libopenssl1_0_0-1.0.2p-3.49.1.x86_64安装教程(RPM包手动安装步骤+依赖解决附安装包下载)

libopenssl1_0_0-1.0.2p-3.49.1.x86_64安装教程(RPM包手动安装步骤+依赖解决附安装包下载)​ ​第一步:先检查下系统环境​ 这包是 ​x86_64 架构的(也就是常见的 64 位 Linux 系统),你得确认自己的系统是 64 位…

Linux_T(Sticky Bit)粘滞位详解 - 详解

Linux_T(Sticky Bit)粘滞位详解 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

和顺网站建设电商推广和网络推广的策略

桥梁模式 定义 桥梁模式&#xff08;Bridge Pattern&#xff09;也叫做桥接模式。 将抽象和显示解耦&#xff0c;使得两者可以独立地变化。 优缺点、应用场景 优点 抽象和实现的解耦。 这是桥梁模式的主要特点&#xff0c;它完全是为了解决继承的缺点而提出的设计模式。优…

P2831 [NOIP 2016 提高组] 愤怒的小鸟 题解

传送门 洛谷 题目大意 每关给你最多18只小猪(后文皆为18只),问你最少用几条过原点抛物线全部干掉。 注意这里 \(m\) 其实没用,因为你要是会算最优解了为啥还需要部分分啊? 思路 \(n\leq18\) ,不是暴搜就是状压。…

t型布局网站怎么做移动网站开发公司

无限网络应用越来越广泛&#xff0c;由此应运而生了许多可以蹭网的软件&#xff0c;家里的网速突然变慢了&#xff0c;也许就是隔壁的小哥哥小姐姐在蹭网络&#xff0c;那么如何避免被蹭网&#xff1f;今天小编给各位小伙伴推荐几款路由器管理软件&#xff0c;发现网络变慢了&a…

网站建设功能要求做男女之间的事情的网站

1.1 APT攻击简介 1.1.1APT攻击概念 网络安全&#xff0c;尤其是Internet互联网安全正在面临前所未有的挑战&#xff0c;这主要就来自于有组织、有特定目标、持续时间极长的新型攻击和威胁&#xff0c;国际上有的称之为APT&#xff08;Advanced Persistent Threat&#xff09;攻…

网站开发公司商业计划书国家备案网查询系统

1 socket本地通信 socket原本是为网络通讯设计的&#xff0c;但后来在socket框架的基础上发展出了一种IPC&#xff08;进程通信&#xff09;机制&#xff0c;即UNIX Domain Socket&#xff0c;专门用来实现使用socket实现的本地进程通信。 本地通信的流程与使用的接口与基于TC…

企顺网网站建设做网站费用上海

文章目录 78. 子集&#xff08;集合的所有子集&#xff09;90. 子集 II&#xff08;集合的所有子集&#xff09;792. 匹配子序列的单词数&#xff08;判断是否为子集&#xff09;500. 键盘行&#xff08;集合的交集&#xff09;409. 最长回文串&#xff08;set&#xff09; 更多…

库存中心(三层库存模型)

目录背景和价值WMS一、货主(Owner)货主(Owner)业务对象的核心属性:3. 库存记录:细化到「SKU+货主+库位」三维度逻辑库存一、逻辑层核心业务对象设计1. 库存主档(LogicalInventory):核心载体参考资料 背景和价…

Valley靶机渗透实战:从凭证复用到Python库劫持

本文详细记录了TryHackMe平台Valley靶机的完整渗透过程,涵盖端口扫描、目录枚举、FTP凭证破解、PCAP分析、SSH登录、UPX脱壳和Python库劫持提权等技术要点。Valley靶机渗透报告 - TryHackMe 本文详细记录了我渗透TryH…

深入解析:IP Search Performance Tests dat/db/xdb/mmdb 结构性能差异对比

深入解析:IP Search Performance Tests dat/db/xdb/mmdb 结构性能差异对比pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

联盟文明网站建设有新突破建设学校网站需要具备

文章目录 指令和参数筛选器远程指令tasklist参数 windows批处理系列&#xff1a;初步&#x1fa9f;命令行设置 指令和参数 tasklist可以获取当前运行的程序列表。当不加参数时&#xff0c;其返回值包括5列&#xff0c;分别是映像名称&#xff0c;PID&#xff0c;会话名&#…

重庆好的网站制作公司济南seo网站排名优化工具

文 | Flood Sung源 | 知乎前言今年最热门的词汇之一当属内卷了。似乎很多行业都由于份额有限而陷入内卷当中。最火的或许是清华学生的这张图&#xff0c;“骑车写代码”&#xff1a;图片来自网络虽然后来知道是这位同学怕关了屏幕程序就断了&#xff0c;但这不禁让人思考&#…

C++篇:002

C++篇:002$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");C++篇:002.模板 一、模板概念 函数模板 函数模板的格式: template<typename T1, typename T…

10.05模拟赛反思

打得太差了。 T1 由于限制了 \(60\) 步导致挂掉 \(50 pts\)。写代码的时候不能太想当然了,只是期望每次减半而不是严格的。有时候写代码觉得是对的就写了,但是可能到了很后面才发现有问题,更严重的话根本不知道有问…

MariaDB收购SkySQL增强AI与无服务器能力

开源数据库公司MariaDB重新收购其前子公司SkySQL,整合其具备AI能力的无服务器云数据库平台。此次收购将增强MariaDB Cloud的代理AI功能和向量数据库支持,提升多云部署灵活性。MariaDB收购前子公司SkySQL以增强代理AI…

单片机寄存器的四种主要类型! - 实践

单片机寄存器的四种主要类型! - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…