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

FreeSql使用

目的:

1.方库分表
2.主从分离

3.分布式事务

过程:

官网:指南 | FreeSql 官方文档

1.Startup.cs 添加配置(本地数据库MySql)

ConfigureServices:

           Func<IServiceProvider, IFreeSql> fsql = r =>{IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, @"Data Source=localhost;Database=testfreesql;User ID=root;Password=123456;pooling=true;port=3306;sslmode=none;CharSet=utf8;").UseMonitorCommand(cmd => Console.WriteLine($"Sql:{cmd.CommandText}"))//监听SQL语句// .UseSlave(@"Data Source = localhost; Database = testfreesql1; User ID = root; Password = 123456; pooling = true; port = 3306; sslmode = none; CharSet = utf8; ", @"Data Source=localhost;Database=testfreesql2;User ID=root;Password=123456;pooling=true;port=3306;sslmode=none;CharSet=utf8;").UseAutoSyncStructure(true) //自动同步实体结构到数据库,FreeSql不会扫描程序集,只有CRUD时才会生成表。.Build();return fsql;};services.AddSingleton<IFreeSql>(fsql);

Configure:

            //在项目启动时,从容器中获取IFreeSql实例,并执行一些操作:同步表,种子数据,FluentAPI等using (IServiceScope serviceScope = app.ApplicationServices.CreateScope()){var fsql = serviceScope.ServiceProvider.GetRequiredService<IFreeSql>();fsql.CodeFirst.SyncStructure(typeof(Blog), typeof(User), typeof(AsTableLog));//Topic 为要同步的实体类}

2.引入组件

    <PackageReference Include="FreeSql" Version="3.2.690" /><PackageReference Include="FreeSql.Cloud" Version="1.6.3" /><PackageReference Include="FreeSql.DbContext" Version="3.2.690" /><PackageReference Include="FreeSql.Provider.MySql" Version="3.2.690" /><PackageReference Include="FreeSql.Provider.Sqlite" Version="3.2.690" />

 3.创建类(自动生成表)

 4.接口调用

using Db.Entities;
using FreeSql;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace TestFreeSql.Controllers
{[Route("api/[controller]/[action]")][ApiController]public class FreeSqlController : ControllerBase{//官方文档:https://freesql.net/guide/getting-started.html//demo作者微信(qq):842725037private readonly ILogger<FreeSqlController> _logger;private readonly IFreeSql _freeSql;private readonly DbContext  _dbContext;private IMemoryCache _cache;public FreeSqlController(ILogger<FreeSqlController> logger, IFreeSql freeSql, IMemoryCache cache){_logger = logger;_freeSql = freeSql;_dbContext = freeSql.CreateDbContext();_cache = cache;}/// <summary>/// 基础使用(增加、查询、删除、)/// </summary>/// <returns></returns>[HttpGet]public  async Task<string> TestFreeSqlBase(){//插入单一数据var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };var save =await _freeSql.Insert<Blog>(blog).ExecuteAffrowsAsync();//查询var select1 =await _freeSql.Select<Blog>().Where(x => x.BlogId == 1).ToListAsync();var select2 = _freeSql.Select<Blog>().ToList();//分页查询var select4 = _freeSql.Select<Blog>().Where(a => a.BlogId > 1);var sql = select4.ToSql();var total = await select4.CountAsync();var list = await select4.Page(1, 20).ToListAsync();//修改var select3 =await _freeSql.Select<Blog>().FirstAsync();select3.Url = DateTime.Now.ToString();var save2 = await _freeSql.InsertOrUpdate<Blog>().SetSource(select3).ExecuteAffrowsAsync();//删除var delete =await _freeSql.Delete<Blog>().Where(x => x.Url == blog.Url).ExecuteAffrowsAsync();return "123";}/// <summary>/// 事务使用/// </summary>/// <returns></returns>[HttpGet]public async Task<string> TestFreeSqlDbContext1(){//工作单元var ctx = _dbContext;var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };ctx.Set<Blog>().Add(blog);var user = new User() { Name = DateTime.Now.ToString(), Age=1 };ctx.Set<User>().Add(user);var save=await ctx.SaveChangesAsync();return "123";}/// <summary>/// 事务使用/// </summary>/// <returns></returns>[HttpGet]public async Task<string> TestFreeSqlDbContext2(){//工作单元var ctx = _freeSql.CreateDbContext();var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };ctx.Set<Blog>().Add(blog);var user = new User() { Name = DateTime.Now.ToString(), Age = 1 };ctx.Set<User>().Add(user);var save = await ctx.SaveChangesAsync();return "123";}/// <summary>/// 读从库、写主库,伪功能(需要自己实现数据库数据同步)/// </summary>/// <returns></returns>[HttpGet]public async Task<string> TestFreeSqlReadWrite(){//文档:https://freesql.net/guide/read-write-splitting.htmlvar select2 = _freeSql.Select<Blog>().Where(x=>x.BlogId>0).ToList();//读取从库//插入单一数据var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };var saveSql =await _freeSql.Insert<Blog>(blog).ExecuteAffrowsAsync();//写入主库var select3 = _freeSql.Select<Blog>().ToList();//读取从库var select4 = _freeSql.Select<Blog>().Master().ToList();//读取主库return "123";}/// <summary>/// 分表(自动分表)/// </summary>/// <returns></returns>[HttpGet]public async Task<string> TestFreeSqlSeparate(){//文档:https://github.com/dotnetcore/FreeSql/discussions/1066//插入单一数据var asTableLog = new AsTableLog() { msg=DateTime.Now.ToString(), createtime=DateTime.Now};var saveSql =await _freeSql.Insert<AsTableLog>(asTableLog).ExecuteAffrowsAsync();//插入单一数据var asTableLog2 = new AsTableLog() { msg = DateTime.Now.ToString(), createtime = DateTime.Now.AddDays(10) };var saveSql2 =await _freeSql.Insert<AsTableLog>(asTableLog2).ExecuteAffrowsAsync();//查询var select = _freeSql.Select<AsTableLog>();//.Where(a => a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1")));var sql = select.ToSql();var list = select.ToList();return "123";}}
}

5.项目地址:

https://github.com/zhihuixitong/TestFreeSql

总结:

1.使用上感觉一般

2.和EF相比唯一有用的分表使用,分库不支持

3.分布式事务看着复杂没有使用

4.读写分离还好,就是要自己实现数据同步

建议:

1.分库分表完善(分库支持)

2.读写分离完善(自动通过配置自己同步数据)

3.分布式事务使用简单化

4.其他基本功能少花点精力优化,重点优化其他组件没有的功能

相关文章:

FreeSql使用

目的: 1.方库分表 2.主从分离 3.分布式事务 过程&#xff1a; 官网&#xff1a;指南 | FreeSql 官方文档 1.Startup.cs 添加配置&#xff08;本地数据库MySql&#xff09; ConfigureServices&#xff1a; Func<IServiceProvider, IFreeSql> fsql r >{IFreeSql …...

Hadoop集群搭建,基于3.3.4hadoop和centos8【图文教程-从零开始搭建Hadoop集群】,常见问题解决

Hadoop集群搭建&#xff0c;基于3.3.4hadoop和centos8【小白图文教程-从零开始搭建Hadoop集群】&#xff0c;常见问题解决Hadoop集群搭建&#xff0c;基于3.3.4hadoop1.虚拟机的创建1.1 第一台虚拟机的创建1.2 第一台虚拟机的安装1.3 第一台虚拟机的网络配置1.3.1 主机名和IP映…...

UE4 材质学习 (焚烧材质)

效果步骤随便从网上下载一张图片&#xff08;地址&#xff1a;链接/链接&#xff09;&#xff0c;导入UE中新建一个材质函数这里命名为“E_Function”双击打开该材质函数&#xff0c;由于需要输出变发光和变透明两种效果&#xff0c;因此这里需要两个输出节点&#xff1a;分别命…...

【c++】STL常用算法2—常用查找算法

文章目录常用查找算法findfind_ifadjacent_findbinary_searchcountcount_if常用查找算法 算法简介&#xff1a; find//查找元素 find_if//按条件查找元素 adjacent_find//查找相邻重复元素 binary_search//二分查找法 count//统计元素个数 count_if//按条件统计元素个数find …...

史上最全最详细的Java架构师成长路径图,程序员必备

从新手码农到高级架构师&#xff0c;要经过几步&#xff1f;要多努力&#xff0c;才能成为为人倚重的技术专家&#xff1f;本文将为你带来一张程序员发展路径图&#xff0c;但你需要知道的是&#xff0c;天下没有普适的道理&#xff0c;具体问题还需具体分析&#xff0c;实践才…...

第五章 事务管理

1.事务概念 *什么是事务&#xff1a;事务是数据库操作最基本单元&#xff0c;逻辑上是一组操作&#xff0c;要么都成功&#xff0c;要么都失败 *事务的特性&#xff08;ACID&#xff09;&#xff1a;原子性、隔离性、一致性、持久性 2.搭建事务操作环境 *模拟场景&#xff…...

Redis:主从同步

Redis&#xff1a;主从同步一. 概述二. 原理(1) 全量同步(2) 增量同步(3) 优化Redis主从集群三. 总结一. 概述 引入&#xff1a; Redis主从集群采用一个Master负责写&#xff0c;多个Slave负责读的方式&#xff08;读多写少&#xff09;&#xff0c;那么如何让读取数据时多个从…...

Unity Animator.Play(stateName, layer, normalizedTime) 播放动画函数用法

原理 接口&#xff1a; public void Play(string stateName, int layer -1, float normalizedTime float.NegativeInfinity);参数含义stateName动画状态机的某个状态名字layer第几层的动画状态机&#xff0c;-1 表示播放第一个状态或者第一个哈希到的状态normalizedTime从s…...

python学习——【第三弹】

前言 上一篇文章 python学习——【第二弹】中学习了python中的运算符内容&#xff0c;这篇文章接着学习python中的流程控制语句。 流程控制指的是代码运行逻辑、分支走向、循环控制&#xff0c;是真正体现我们程序执行顺序的操作。流程控制一般分为顺序执行、条件判断和循环控…...

科技云报道:AI大模型背后,竟是惊人的碳排放

科技云报道原创。 自从ChatGPT这样的大型语言模型在全球引起轰动以来&#xff0c;很少有人注意到&#xff0c;训练和运行大型语言模型正在产生惊人的碳排放量。 虽然OpenAI和谷歌都没有说过他们各自产品的计算成本是多少&#xff0c;但据第三方研究人员分析&#xff0c;ChatG…...

如何根据实际需求选择合适的三维实景建模方式?

随着实景三维中国建设的推进&#xff0c;对三维实景建模的数字化需求大幅增加。由于三维实景建模具有采集速度快、计算精度高等建模优势&#xff0c;引起了各个行业的高度关注。三维实景建模是一种应用数码相机或者激光扫描仪对现有场景进行多角度环视拍摄&#xff0c;然后利用…...

CENTO OS上的网络安全工具(十八)ClickHouse及编程环境部署

这篇其实去年就写好了&#xff0c;孰知就在12月31日那一天打进决赛圈&#xff0c;一躺&#xff0c;二过年&#xff0c;三休假&#xff0c;四加班&#xff0c;居然到了三个月以后&#xff0c;才有机会将它发出来…… 一年也就四个季度不是&#xff0c;实在是光阴荏苒&#xff0c…...

Java中class文件的格式

常见的class文件格式如下图所示&#xff0c;下面我将对一下格式一一作出解释。 一、magic 该部分主要是对语言类型的规范&#xff0c;只有magic这个部分是CAFEBABE时才能被检测为Java语言&#xff0c;否则则不是。 二、minor version和major version minor version主要表示了…...

C++排序算法

排序算法复习 冒泡排序 链接&#xff1a;https://www.runoob.com/w3cnote/bubble-sort.html 每次循环对比【相邻】两个元素&#xff0c;将最大的元素放到数组最后 void bubbleSort(int* arr, int n){//每次确认一个元素的最终位置&#xff0c;循环n-1次即可确认全部元素的最…...

JAVA后端部署项目三步走

1. JAVA部署项目三步走 1.1 查看 运行的端口 lsof -i:8804 &#xff08;8804 为端口&#xff09; 发现端口25111被监听 1.2 杀死进程,终止程序 pid 为进程号 kill -9 pid 1.3 后台运行jar包 nohup java -jar -Xms128M -Xmx256M -XX:MetaspaceSize128M -XX:MaxM…...

php使用zookeeper实现分布式锁

介绍 一、zookeeper和redis实现分布式锁的对比 1、redis 分布式场景应用比较广泛&#xff0c;redis分布式锁&#xff0c;其实需要自己不断去尝试获取锁&#xff0c;比较消耗性能&#xff1b;zk分布式锁&#xff0c;获取不到锁&#xff0c;注册个监听器即可&#xff0c;不需要不…...

力扣-可回收且低脂的产品

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道超级超级超级简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1757. 可回收且低脂的产品二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交S…...

代码随想录刷题-数组-二分查找

文章目录写在前面原理习题题目1思路和代码题目-2写在前面 这个专栏是记录我刷代码随想录过程中的随想和总结。每一小节都是根据自己的理解撰写的&#xff0c;文章比较短&#xff0c;主要是为了记录和督促自己。刷完一章后&#xff0c;我会再单独整理一篇文章来总结和分享。 本…...

HCIA复习1

HCIA复习 抽象语言---->编码 编码---->二进制 二进制--->电信号 处理电信号 OSI参考模型----OSI/RM 应用层 表示层 会话层 传输层 端口号&#xff1a;0-65535&#xff1b;1-1023是注明端口 网络层 IP地址 数据链路层 物理层 ARP协议 正向ARP---通过IP地址获取目的MAC地…...

Kotlin中的destructuring解构声明

开发中有时只是想分解一个包含多个字段的对象来初始化几个单独的变量。要实现这一点&#xff0c;可以使用Kotlin的解构声明。本文主要了解&#xff1a;“1、如何使用解构声明这种特性 2、底层是如何实现的 3、如何在你自己的类中实现它1、解构声明的使用解构声明&a…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...