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

.NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试

2023年11月15日,对.net的开发圈是一个重大的日子,.net 8.0正式版发布。

圈内已经预热了有半个月有余,性能不断超越,开发体验越来越完美,早在.net 5.0的时候就各种吹风Aot编译,直到6.0 7.0使用仍然比较麻烦,我个人比较期待本次更新的aot体验。

有的群友几个小时都等不了啦,半夜就开始更新预览版,我是等到第二天早上正式布发布才开始的,开机第一件事情下载.net8.0 SDK,随后更新vs2022企业版。


支持开源

我是开源人:https://github.com/2881099

本文通过我们的开源项目升级,以及AOT试验,记录了整个经验过程。

使用我们开源项目的朋友一般都知道,特点依赖较少(甚至零依赖),每次 .net 新版本发布很轻松就支持了,并且为 AOT 埋下了种子。

第一个要更新的开源项目是FreeRedis,这个项目没有任何外部依赖,本身是支持.net 8.0的,本次维护主要把和测试有关项目类型修改成.net8.0,前后只花了大概十分钟,跑完测试后发布了 FreeRedis 1.2.5

FreeRedis 是 .NETFramework 4.0 及以上 访问 redis-server 的客户端组件

第二个要更新的开源项目是CSRedisCore,大致步骤同上,目前这个项目处于稳定维护阶段,不再增加新功能。

CSRedisCore 是 .NETFramework 4.0 及以上 访问 redis-server 的客户端组件,也是 FreeSql 作者早年发布的 nuget 版本

第三个要更新的开源项目是FreeSql,这个项目比较庞大,解决方案内有50个子项目,由于主项目也是零依赖,所以基本不需要修改就支持.net8.0。最新编译器提示.netcoreapp2.1高风险漏洞的警告,不得已移除了.netcoreapp2.1有关的依赖注入支持,前后大约花了半个小时,测试后发布了 FreeSql 3.2.805

FreeSql 是一款功能强大的对象关系映射(O/RM)组件,支持 .NET Core 2.1+、.NET Framework 4.0+ 以及 Xamarin✨

第四个要更新的项目是FreeScheduler,这是一个纯净版的定时任务框架,依赖较少只花了5分钟测试发布。

FreeScheduler 实现轻量化定时任务调度,支持集群、临时的延时任务和重复循环任务(可持久化),可按秒,每天/每周/每月固定时间,自定义间隔执行,支持 .NET Core 2.1+、.NET Framework 4.0+ 运行环境。

其他几个开源项目稳定且不依赖 .net 版本,所以本次无需维护更新。


测试与支持 FreeRedis aot

下午没事去买了一杯咖啡,到12点钟还睡不着,刷视频刷到一点半还是睡不着,于是想折腾点什么东西,正好.net 8.0 aot特性,测试一下FreeRedis,看看是否支持。

我是直接创建控制台程序测试的,设置成aot发布之后,.csproj 内容如下:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><PublishAot>True</PublishAot></PropertyGroup><ItemGroup><PackageReference Include="FreeRedis" Version="1.2.5" /></ItemGroup>
</Project>

发布 aot 需要使用控制台命令:

dotnet publish -r win-x64 -c release

第一次发布失败,提示要安装桌面版C++,于是我重新去官网下载vS2022企业版安装器,运行它点击修改安装,选中桌面版C++进行安装,大概过了15分钟,安装完毕。

如果已经安装过vs2022,在此点击修改

我可怜的C盘,要占4G多

E:\github\FreeRedis\examples\console_net8>dotnet publish -r win-x64 -c release
适用于 .NET MSBuild 版本 17.8.3+195e7f5a3正在确定要还原的项目…所有项目均是最新的,无法还原。console_net8 -> E:\github\FreeRedis\examples\console_net8\bin\release\net8.0\win-x64\console_net8.dllGenerating native code
C:\Users\28810\.nuget\packages\freeredis\1.2.5\lib\netstandard2.0\FreeRedis.dll : warning IL3053: Assembly 'FreeRedis'
produced AOT analysis warnings. [E:\github\FreeRedis\examples\console_net8\console_net8.csproj]
C:\Users\28810\.nuget\packages\freeredis\1.2.5\lib\netstandard2.0\FreeRedis.dll : warning IL2104: Assembly 'FreeRedis'
produced trim warnings. For more information see https://aka.ms/dotnet-illink/libraries [E:\github\FreeRedis\examples\c
onsole_net8\console_net8.csproj]console_net8 -> E:\github\FreeRedis\examples\console_net8\bin\release\net8.0\win-x64\publish\

只要编译成功,发布aot必然会成功,只是会有一些警告。

2023/11/16  13:06         5,637,120 console_net8.exe
2023/11/16  13:06       137,695,232 console_net8.pdb
2023/11/16  04:13           127,268 FreeRedis.pdb

请无视 .pdb 文件,它是调试用途的可以删除,console_net8.exe 只有 5兆大小。

第二次发布后,运行成功了,纯字符串数值之内的操作全部成功。

正当得意之时,redis.AclGetUser 方法抛出了一个新的错误,该方法返回的是一个实体类型 AclGetUserResult,有使用 Activetor.CreateInstance(typeof(AclGetUserResult)),Aot本身是支持这个方法的,错误提示是不支持该方法的对象类型 AclUserResult。

Unhandled Exception: System.MissingMethodException: No parameterless constructor defined for type 'FreeRedis.AclGetUserResult'.at System.ActivatorImplementation.CreateInstance(Type, Boolean) + 0x119at FreeRedis.RespHelper.CreateInstanceGetDefaultValue(Type) + 0x120at FreeRedis.RespHelper.MapToClass[T](Object[], Encoding) + 0x4aat FreeRedis.RedisClient.<>c__DisplayClass457_0.<AclGetUser>b__1(Object[] a, Boolean _) + 0x220at FreeRedis.RedisResult.ThrowOrValue[TValue](Func`3) + 0x58at FreeRedis.RedisClient.PoolingAdapter.<>c__DisplayClass9_0`1.<AdapterCall>b__0() + 0x141at FreeRedis.RedisClient.LogCallCtrl[T](CommandPacket cmd, Func`1 func, Boolean aopBefore, Boolean aopAfter) + 0x3bbat FreeRedis.RedisClient.LogCall[T](CommandPacket cmd, Func`1 func) + 0x63at FreeRedis.RedisClient.PoolingAdapter.AdapterCall[TValue](CommandPacket, Func`2) + 0x9aat console_net8.Program.Main(String[] args) + 0xa4at console_net8!<BaseAddress>+0x2c67f0

于是我系统的去看了官方aot文档,发现文档太过于简陋,反复看了七八遍也没有找到相关的解决内容。不得已扩大了搜索范围,在谷歌搜索关键字 .net aot 花了近一个小时,最终定位的关键字是 rd.xml,配置相当简单,只需要把FreeRedis的类型全部配置即可。

对应的 .csproj 内容如下:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><PublishAot>True</PublishAot></PropertyGroup><ItemGroup><RdXmlFile Include="rd.xml" /></ItemGroup><ItemGroup><PackageReference Include="FreeRedis" Version="1.2.5" /></ItemGroup>
</Project>

对应的 rd.xml 内容如下:

<Directives><Application><Assembly Name="FreeRedis"  Dynamic="Required All"></Assembly></Application>
</Directives>

重新发布后,完美的解决所有问题,.exe 文件体积增涨到 7兆。

这多亏当初设计FreeRedis的时候把依赖简单最低,才这么容易支持更多的运行平台。


第二轮aot试验 FreeScheduler

FreeRedis对.net 8.0以及aot的支持完美收官,这个时候已经凌晨三点,咖啡的劲还很足。

我本身对FreeSql Aot是不抱希望的,所以,就去测试FreeScheduler了。

FreeScheduler支持三种存储方式,内存/数据库/redis

基于内存,毫无压力,直接通过测试。(得益于依赖较少)

基于redis,由于FreeRdis通过了aot测试,基本不会有太大的问题,记得设置好rd.xml,顺利通过。

对应的 .csproj 如下:

<Project Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net8.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings><InvariantGlobalization>true</InvariantGlobalization><PublishAot>true</PublishAot></PropertyGroup><ItemGroup><RdXmlFile Include="rd.xml" /></ItemGroup><ItemGroup><ProjectReference Include="..\..\FreeScheduler\FreeScheduler.csproj" /></ItemGroup>
</Project>

对应的 rd.xml 内容如下:

<Directives><Application><Assembly Name="FreeScheduler"  Dynamic="Required All"></Assembly><Assembly Name="FreeRedis"  Dynamic="Required All"></Assembly></Application>
</Directives>

FreeScheduler还有一个web管理面板功能,抱着尝试的态度试一试,创建.net8.0自带的web API aot项目,把有关代码加到项目的运行,居然能直接通过,太牛逼了,这是我没有想到的。

对应 Program.cs

using FreeRedis;
using FreeScheduler;
using Newtonsoft.Json;var redis = new RedisClient("127.0.0.1,poolsize=10,exitAutoDisposePool=false");
redis.Serialize = obj => JsonConvert.SerializeObject(obj);
redis.Deserialize = (json, type) => JsonConvert.DeserializeObject(json, type);
redis.Notice += (s, e) =>
{if (e.Exception != null)Console.WriteLine(e.Log);
};
Scheduler scheduler = new FreeSchedulerBuilder().OnExecuting(task =>{Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}] {task.Topic} 被执行");task.Remark("log..");}).UseStorage(redis).Build();
if (Datafeed.GetPage(scheduler, null, null, null, null).Total == 0)
{scheduler.AddTask("[系统预留]清理任务数据", "86400", -1, 3600);scheduler.AddTaskRunOnWeek("(周一)武林大会", "json", -1, "1:12:00:00");scheduler.AddTaskRunOnWeek("(周日)亲子活动", "json", -1, "0:00:00:00");scheduler.AddTaskRunOnWeek("(周六)社交活动", "json", -1, "6:00:00:00");scheduler.AddTaskRunOnMonth("月尾最后一天", "json", -1, "-1:16:00:00");scheduler.AddTaskRunOnMonth("月初第一天", "json", -1, "1:00:00:00");scheduler.AddTask("定时20秒", "json", 10, 20);scheduler.AddTask("测试任务1", "json", new[] { 10, 30, 60, 100, 150, 200 });
}var builder = WebApplication.CreateSlimBuilder(args);builder.Services.AddSingleton(scheduler);var app = builder.Build();
var applicationLifeTime = app.Services.GetService<IHostApplicationLifetime>();
applicationLifeTime.ApplicationStopping.Register(() =>
{scheduler.Dispose();redis.Dispose();
});
app.UseFreeSchedulerUI("/freescheduler/");app.Run();

2023/11/16  04:23               127 appsettings.Development.json
2023/11/16  04:23               151 appsettings.json
2023/11/16  13:34        25,104,384 Examples_FreeScheduler_Net80_aot.exe
2023/11/16  13:34       238,948,352 Examples_FreeScheduler_Net80_aot.pdb
2023/11/16  13:31            31,208 FreeScheduler.pdb

Examples_FreeScheduler_Net80_aot.exe 25兆,流弊了,双击运行它吧~~~~

打开浏览器访问:http://localhost:5000/freescheduler/

FreeScheduler 管理面板

意想不到,连管理面板都支持 AOT,这让我有了继续试验的动力~~~


aot试验意外收获 FreeSql

四点了,还没犯困!

最后抱着必凉的心态尝试终极试验,FreeScheduler使用数据库持久化。

第一次失败,报错在FreeSql内部,这是是有TaskInterval类型不存在,它其实是FreeScheduler程序集的,并且rd.xml已经配置好了,反复折腾仍然报错。

Unhandled Exception: System.NotSupportedException: 'FreeScheduler.TaskInterval[]' is missing native code or metadata. This can happen for code that is not compatible with trimming or AOT. Inspect and fix trimming and AOT related warnings that were generated when the app was published. For more information see https://aka.ms/nativeaot-compatibilityat System.Reflection.Runtime.General.TypeUnifier.WithVerifiedTypeHandle(RuntimeArrayTypeInfo, RuntimeTypeInfo) + 0x54at System.Array.InternalCreate(RuntimeType elementType, Int32 rank, Int32* pLengths, Int32* pLowerBounds) + 0x64at System.Array.CreateInstance(Type elementType, Int32 length) + 0x46at System.RuntimeType.GetEnumValues() + 0x53at FreeSql.Internal.Utils.GetTableByEntity(Type entity, CommonUtils common) + 0x138aat FreeSql.Internal.CommonProvider.CodeFirstProvider.<SyncStructure>b__51_0(CodeFirstProvider.TypeAndName a) + 0x6eat System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() + 0x3fat System.Linq.Enumerable.WhereEnumerableIterator`1.ToArray() + 0x5cat FreeSql.Internal.CommonProvider.CodeFirstProvider.SyncStructure(CodeFirstProvider.TypeAndName[] objects) + 0xd6at FreeSql.Internal.CommonProvider.CodeFirstProvider.SyncStructure[TEntity]() + 0x6cat FreeScheduler.TaskHandlers.FreeSqlHandler..ctor(IFreeSql fsql) + 0xf0at FreeSchedulerBuilder.Build() + 0x2fat Program.<Main>$(String[] args) + 0x180at Examples_FreeScheduler_Net80_aot!<BaseAddress>+0xca7fc3

从堆栈 GetEnumValues 可以看出是执行 Enum.GetValues 报错,通过不断尝试中的其中一次,在程序开始写了一行:

Console.WriteLine(Enum.GetValues(typeof(TaskInterval)));

重新发布后,又出现另一个错误,大致与上面的相同,只是类型变成了 TaskStatus,同样加上一行代码:

Console.WriteLine(Enum.GetValues(typeof(TaskStatus)));

又出现了另一个错误:

Unhandled Exception: System.InvalidOperationException: The binary operator Equal is not defined for the types 'System.Reflection.Runtime.TypeInfos.NativeFormat.NativeFormatRuntimeNamedTypeInfo' and 'System.Reflection.Runtime.TypeInfos.RuntimeConstructedGenericTypeInfo'.at System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType, String, Expression, Expression, Boolean) + 0x26bat System.Linq.Expressions.Expression.Equal(Expression, Expression, Boolean, MethodInfo) + 0x63at FreeSql.Internal.Utils.<GetDataReaderValueBlockExpression>g__LocalFuncGetExpression|65_0(Boolean ignoreArray, Utils.<>c__DisplayClass65_0&) + 0x3916at FreeSql.Internal.Utils.GetDataReaderValueBlockExpression(Type type, Expression value) + 0x18dat FreeSql.Internal.Utils.<>c__DisplayClass66_0.<GetDataReaderValue>b__1(Type valueType2) + 0x68at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey, Func`2) + 0xa4at FreeSql.Internal.Utils.GetDataReaderValue(Type type, Object value) + 0x147at FreeSql.Internal.Utils.GetTableByEntity(Type entity, CommonUtils common) + 0x145cat FreeSql.Internal.CommonProvider.CodeFirstProvider.<SyncStructure>b__51_0(CodeFirstProvider.TypeAndName a) + 0x6eat System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() + 0x3fat System.Linq.Enumerable.WhereEnumerableIterator`1.ToArray() + 0x5cat FreeSql.Internal.CommonProvider.CodeFirstProvider.SyncStructure(CodeFirstProvider.TypeAndName[] objects) + 0xd6at FreeSql.Internal.CommonProvider.CodeFirstProvider.SyncStructure[TEntity]() + 0x6cat FreeScheduler.TaskHandlers.FreeSqlHandler..ctor(IFreeSql fsql) + 0xf0at FreeSchedulerBuilder.Build() + 0x2fat Program.<Main>$(String[] args) + 0x1a8at Examples_FreeScheduler_Net80_aot!<BaseAddress>+0xca8423

这次使用 vs2022 附加进程的方式进行了调试,深入 FreeSql 内部源码(表达式树)环境,定位到了一行代码:

Expression.Equal(type, Expression.Contrast(Guid?))

把 Guid? 后面的问题去掉后,再次发布。(由于每次发布时间要20-30秒,重试时间成本太高,卡在这个问题已经有半个小时)

2023/11/16  04:23               127 appsettings.Development.json
2023/11/16  04:23               151 appsettings.json
2023/11/16  13:52        29,018,112 Examples_FreeScheduler_Net80_aot.exe
2023/11/16  13:52       238,948,352 Examples_FreeScheduler_Net80_aot.pdb
2023/11/16  13:31            31,208 FreeScheduler.pdb
2021/11/03  01:47         1,763,632 SQLite.Interop.dll

对于一个 web 项目并且包含 bootstrap 有关静态资源文件,.exe 文件只有 29兆太满意了

看到控制台上的 SQL,太惊喜了,成功啦~~~~


最后建议

从 .net6.0 到 .net8.0,我们肉眼看不到变化,实际微软做了很多内部工作,在 aot 使用体验上明显能感知。

有人说信创国产运行,那现在 aot 算什么?

.net8.0 AOT 已经到了可用的阶段,期待未来版本能改进以下问题:

  • 发布速度变快,目前20-30秒一次实在太慢
  • 编译前检查错误,而不是等发布后再报运行时错误
  • 加强调试,.pdb 100兆++ 为何调试还都是 c++ 有关内容,不能白瞎了这么大的调试文件啊
  • 尽快修复 Console.WriteLine(Enum.GetValues(typeof(TaskInterval))) 这个问题

我是开源人:https://github.com/2881099

Native AOT apps have the following limitations:

  • No dynamic loading, for example, Assembly.LoadFile.
  • No run-time code generation, for example, System.Reflection.Emit.
  • No C++/CLI.
  • Windows: No built-in COM.
  • Requires trimming, which has limitations.
  • Implies compilation into a single file, which has known incompatibilities.
  • Apps include required runtime libraries (just like self-contained apps, increasing their size as compared to framework-dependent apps).
  • System.Linq.Expressions always use their interpreted form, which is slower than run-time generated compiled code.
  • Not all the runtime libraries are fully annotated to be Native AOT compatible. That is, some warnings in the runtime libraries aren’t actionable by end developers.

相关文章:

.NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试

2023年11月15日&#xff0c;对.net的开发圈是一个重大的日子&#xff0c;.net 8.0正式版发布。 圈内已经预热了有半个月有余&#xff0c;性能不断超越&#xff0c;开发体验越来越完美&#xff0c;早在.net 5.0的时候就各种吹风Aot编译&#xff0c;直到6.0 7.0使用仍然比较麻烦…...

Django之模型层

【1】常见的13中查询方法 例子语法&#xff1a;models.Userinfo.objects.filter().all() 查询方法解释all()查询所有数据first()那queryset中第一条数据last()那最后一条数据filter()带有过滤条件的查询&#xff0c;查询不到结果返回Noneget()带有guolv条件的查询&#xff0c;…...

京东数据挖掘(京东运营数据分析):2023年宠物行业数据分析报告

随着社会经济的发展&#xff0c;人均收入水平逐渐提高&#xff0c;使得宠物成为越来越多家庭的成员&#xff0c;宠物数量不断增长。伴随养宠人群的增多&#xff0c;宠物相关产业的发展也不断升温&#xff0c;宠物经济规模持续增长。 根据鲸参谋平台的数据显示&#xff0c;在宠物…...

五分钟k8s实战-Istio 网关

istio-03.png 在上一期 k8s-服务网格实战-配置 Mesh 中讲解了如何配置集群内的 Mesh 请求&#xff0c;Istio 同样也可以处理集群外部流量&#xff0c;也就是我们常见的网关。 其实和之前讲到的k8s入门到实战-使用Ingress Ingress 作用类似&#xff0c;都是将内部服务暴露出去的…...

vue-admin-template

修改登录接口 1.f12查看请求接口 模仿返回数据写接口 修改方式1 1.在env.devolopment修改 修改方式2 vue.config.js 改成本地接口地址 配置转发 后端创建相应接口&#xff0c;使用map返回相同的数据 修改前端请求路径 修改前端返回状态码 utils里面的request.js...

Go fsnotify简介

fsnotify是一个用Go编写的文件系统通知库。它提供了一种观察文件系统变化的机制&#xff0c;例如文件的创建、修改、删除、重命名和权限修改。它使用特定平台的事件通知API&#xff0c;例如Linux上的inotify&#xff0c;macOS上的FSEvents&#xff0c;以及Windows上的ReadDirec…...

分类预测 | Matlab实现PSO-BiLSTM-Attention粒子群算法优化双向长短期记忆神经网络融合注意力机制多特征分类预测

分类预测 | Matlab实现PSO-BiLSTM-Attention粒子群算法优化双向长短期记忆神经网络融合注意力机制多特征分类预测 目录 分类预测 | Matlab实现PSO-BiLSTM-Attention粒子群算法优化双向长短期记忆神经网络融合注意力机制多特征分类预测分类效果基本描述程序设计参考资料 分类效果…...

【Python】Pandas(学习笔记)

一、Pandas概述 1、Pandas介绍 2008年WesMcKinney开发出的库&#xff0c;专门用于数据挖掘的开源python库 以Numpy为基础&#xff0c;借力Numpy模块在计算方面性能高的优势 基于matplotib&#xff0c;能够简便的画图 独特的数据结构 import pandas as pd2、Pandas优势 便…...

京联易捷科技与劳埃德私募基金管理有限公司达成合作协议签署

京联易捷科技与劳埃德私募基金管理有限公司今日宣布正式签署合作协议,双方在数字化进程、资产管理与投资以及中英金融合作方面将展开全面合作。 劳埃德(中国)私募基金管理有限公司是英国劳埃德私募基金管理有限公司的全资子公司,拥有丰富的跨境投资经验和卓越的募资能力。该集…...

Netty Review - 从BIO到NIO的进化推演

文章目录 BIODEMO 1DEMO 2小结论单线程BIO的缺陷BIO如何处理并发多线程BIO服务器的弊端 NIONIO要解决的问题模拟NIO方案一&#xff1a; &#xff08;等待连接时和等待数据时不阻塞&#xff09;方案二&#xff08;缓存Socket&#xff0c;轮询数据是否准备好&#xff09;方案二存…...

​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第9章 软件可靠性基础知识&#xff08;P320~344&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图...

M系列 Mac安装配置Homebrew

目录 首先&#xff0c;验证电脑是否安装了Homebrew 1、打开终端输入以下指令&#xff1a; 2、如图所示&#xff0c;该电脑没有安装Homebrew &#xff0c;下面我们安装Homebrew 一、官网下载 &#xff08;不建议&#xff09; 1、我们打开官网&#xff1a;https://brew.sh/ …...

WebRTC简介及使用

文章目录 前言一、WebRTC 简介1、webrtc 是什么2、webrtc 可以做什么3、数据传输需要些什么4、SDP 协议5、STUN6、TURN7、ICE 二、WebRTC 整体框架三、WebRTC 功能模块1、视频相关①、视频采集---video_capture②、视频编解码---video_coding③、视频加密---video_engine_encry…...

网工内推 | 国企、上市公司售前,CISP/CISSP认证,最高18K*14薪

01 中电福富信息科技有限公司 招聘岗位&#xff1a;售前工程师&#xff08;安全&#xff09; 职责描述&#xff1a; 1、对行业、用户需求、竞争对手等方面提出分析报告&#xff0c;为公司市场方向、产品研发和软件开发提供建议&#xff1b; 2、负责项目售前跟踪、技术支持、需…...

阿里云99元VS腾讯云88元,双11云服务器价格战,谁胜谁负?

在2023年的双十一优惠活动中&#xff0c;阿里云推出了一系列令人惊喜的优惠活动&#xff0c;其中包括99元一年的超值云服务器。本文将带您了解这些优惠活动的具体内容&#xff0c;以及与竞争对手腾讯云的价格对比&#xff0c;助您轻松选择最适合的云服务器。 99元一年服务器优…...

1.jvm基本知识

目录 概述jvm虚拟机三问jvm是什么&#xff1f;java 和 jvm 的关系 为什么学jvm怎么学习为什么jvm调优?什么时候jvm调优调优调什么 结束 概述 相关文章在此总结如下&#xff1a; 文章地址jvm类加载系统地址双亲委派模型与打破双亲委派地址运行时数据区地址运行时数据区-字符串…...

前端---掌握WebAPI:DOM

文章目录 什么是DOM&#xff1f;使用DOM获取元素事件操作元素获取、修改元素内容获取、修改元素属性获取、修改表单元素属性&#xff1a;input获取、修改样式属性直接修改样式&#xff1a;行内样式通过修改class属性来修改样式 新增节点删除节点 什么是DOM&#xff1f; DOM&am…...

最优化基础(一)

最优化基础&#xff08;一&#xff09;1 最优化问题的数学模型 通俗地说&#xff0c;所谓最优化问题&#xff0c;就是求一个多元函数在某个给定集合上的极值. 几乎所有类型的最优化问题都可以用下面的数学模型来描述: m i n f ( x ) s . t . x ∈ Ω min\ f({x})\\ s.t. \ {…...

基于JavaWeb+SpringBoot+Vue医疗器械商城微信小程序系统的设计和实现

基于JavaWebSpringBootVue医疗器械商城微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 摘 要 目前医疗器械行业作为医药行业的一个分支&#xff0c;发展十分迅速。…...

java程序中为什么经常使用tomcat

该疑问的产生场景&#xff1a; 原来接触的ssm项目需要在项目配置中设置tomcat&#xff0c;至于为什么要设置tomcat不清楚&#xff0c;只了解需要配置tomcat后项目才能启动。接触的springboot在项目配置中不需要配置tomcat&#xff0c;原因是springboot框架内置了tomcat&#xf…...

大带宽服务器需要选择哪些节点

选择大带宽服务器节点需要考虑以下几个因素&#xff1a; 地理位置&#xff1a;选择距离用户较近的节点&#xff0c;可以降低延迟&#xff0c;提高响应速度。 网络质量&#xff1a;大带宽服务器节点应该有良好的网络质量&#xff0c;稳定可靠&#xff0c;能够提供高速的网络传输…...

CSS 属性学习笔记(入门)

1. 选择器 CSS选择器用于选择要样式化的HTML元素。以下是一些常见的选择器&#xff1a; 元素选择器 p {color: blue; }描述&#xff1a; 选择所有 <p> 元素&#xff0c;并将文本颜色设置为蓝色。 类选择器 .highlight {background-color: yellow; }描述&#xff1a;…...

[Android]使用View Binding 替代findViewById

1.配置 build.gradle文件中添加配置&#xff0c;然后同步。 android {...buildFeatures {viewBinding true} } 2.用 View Binding 类来访问布局中的视图 在Activity代码的顶部导入生成的 View Binding 类&#xff1a; import com.example.yourapp.databinding.ActivityMai…...

Pytest UI自动化测试实战实例

环境准备 序号库/插件/工具安装命令1确保您已经安装了python3.x2配置python3pycharmselenium2开发环境3安装pytest库 pip install pytest 4安装pytest -html 报告插件pip install pytest-html5安装pypiwin32库(用来模拟按键)pip install pypiwin32 6安装openpyxl解析excel文…...

软件测试/测试开发丨接口自动化测试学习笔记,多环境自动切换

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/28026 多环境介绍 环境使用场景备注dev开发环境开发自测QA测试环境QA日常测试preprod预发布环境回归测试、产品验测试prod线上环境用户使用的环境 通过环…...

Spring-IoC与DI入门案例

IoC入门案例 IoC入门案例思路分析 管理什么&#xff1f;&#xff08;Service与Dao&#xff09;如何将被管理的对象告知IoC容器&#xff1f;&#xff08;配置&#xff09;被管理的对象交给IoC容器&#xff0c;如何获取到IoC容器&#xff1f;&#xff08;接口&#xff09;IoC容…...

windows虚拟内存自定义分配以及mysql错误:Row size too large (> 8126)

文章目录 虚拟内存概要windows-server配置虚拟内存技术名词解释关于mysql错误Row size too large (> 8126)问题分析解决办法 虚拟内存概要 虚拟内存别称虚拟存储器&#xff08;Virtual Memory&#xff09;。电脑中所运行的程序均需经由内存执行&#xff0c;若执行的程序占用…...

自动备份pgsql数据库

bat文件中的内容&#xff1a; PATH D:\Program Files\PostgreSQL\13\bin;D:\Program Files\7-Zip set PGPASSWORD**** pg_dump -h 8.134.151.187 -p 5466 -U sky -d mip_db --schema-only -f D:\DB\backup\%TODAY%-schema-mip_db_ali.sql pg_dump -h 8.134.151.187 -p 5466…...

networkx使用draw画图报错:TypeError: ‘_AxesStack‘ object is not callable

一、问题描述 在使用networkx的draw绘图时nx.draw(g,posnx.spring_layout(g))&#xff0c;报错&#xff1a;TypeError: _AxesStack object is not callable 二、原因 可能是当前python环境下的networkx和matplotlib的版本不匹配。我报错时的networkx2.8&#xff0c;matplotl…...

tcpdump 常用命令

wireshark抓包抓取服务器10.20.1.101上的包&#xff0c;使用网络接口wlan ./tcpdump -vvv host 192.168.137.142 and 10.20.1.101 and ! port 23 -w rtmp.cap ./tcpdump -vvv host port 9013 -w ppt.cap...