【.NET 6】使用EF Core 访问Oracle+Mysql+PostgreSQL并进行简单增改操作与性能比较
前言
唠嗑一下。都在说去O或者开源,但是对于数据库选型来说,很多人却存在着误区。例如,去O,狭义上讲,是去Oracle数据库。但是从广义上来说,是去Oracle公司产品或者具有漂亮国垄断地位和需要商业授权的数据库产品。
去O,目前国内有一个现象,就是很多公司或个人听到去O,第一反应是改用Mysql,实际上Mysql也是Oracle公司的。而且Mysql虽然是开源的,但是需要遵循GPL开源协议,这个协议里面(大概意思)含有这么两点就可以窥见一斑:
1、如果用Mysql源码进行二次修改,修改后的产品也必须开源,例如目前国产分布式数据库TiDB就遵循该协议进行开源;
2、如果要对Mysql二次封装或者修改后进行实现商业版本,就必须取得甲骨文公司授权。以上这两条,就足以让Mysql这款开源数据库并不具备“开源优势”,将来该被制裁还是会被制裁。
目前去O,还有一款备选开源数据库是PostgreSQL,它是基于BSD开源协议的,该开源协议是四大开源协议里面最“开放”和自由的,不会受到商业版权化影响,并且组织或个人也可以通过它的源码进行二次封装或者进行发行商业版,例如华为的OpenGuass是基于该开源版本进行二次开发的,并且基于PostgreSQL或者基于OpenGuass进行二次封装成商业版本的数据库(国产、非国产等)也比比皆是。
以上只是吐个槽,本篇文章主要是想通过.NET6+EF CORE + 三大数据库,进行一个在同等环境下的简单的读写性能测试。
【备注】由于各种原因,接下来的测试结果可能会不准确,以下仅供学习或参考使用。
数据库运行环境:Cent OS 7.5
PostgreSQL版本:14
MySQL数据库版本:8.0
Oracle数据库:12C 64位
客户端环境:WIN 10 专业版
运行时环境:.NET 6
ORM:EF CORE
开发语言:C#
CentOS环境安装PostgreSQL
远程服务器上已有授权的Oracle环境和Mysql环境,所以具体安装细节不再进行描述,如果感兴趣的小伙伴也可以自行百度一下Oracle和Mysql的安装教程,应该非常多。由于服务器上暂时还没有PostgreSQL环境,我暂且也把安装PostgreSQL的安装步骤也顺手记录下。
PostgreSQL安装:
下载地址:
https://www.postgresql.org/download/linux/redhat/
选择版本以后,会有对应提示的安装方式命令,就不发出来了,可自行参考。
以下是安装以后的一些配置。
安装完毕,并且启动pgsql服务以后,此处我先创建一个测试用的数据库:testdb
使用命令:su - postgres 可以进行默认的登录,默认无密码。

登陆以后使用命令:psql 可以进入到可执行SQL的命令的页面,以postgres=# 开头。其他命令和有关创建用户的SQL语句如图所示。

修改配置文件: /var/lib/pgsql/14/data/postgresql.conf
将注释的listen_addresses打开,设置值为 ‘*’
路径上的14代表版本,如果是13版本就是13,以此类推,下同。

修改/var/lib/pgsql/14/data/pg_hba.conf配置文件,对IPV4访问新增一行配置如下:

然后要重启pgsql服务,以用于生效。
由于pgsql默认的端口是5432,为了可以跨远程访问,此处把远程服务器上的端口开放出来。命令:firewall-cmd --zone=public --add-port=5432/tcp --permanent
然后重载防火墙,命令:firewall-cmd --reload
测试数据库有关表结构。以下表均没有设置索引,仅单表测试,结果仅供参考。
Mysql表结构:

PostgreSQL表结构:

Oracle表结构:

.NET 6开发测试代码
先创建一个minimal api项目,以及一个服务类库项目。类库引用需要操作Oracle数据库、MySQL数据库以及Postgresql数据库有关的组件。

对服务类设置为启动项,然后新增三个文件夹(MyModel,OraModel和PgModel),用于分别存放三个数据库的实体类。然后在程序包管理控制台上,通过命令:
Scaffold-DbContext “mysql连接字符串" Pomelo.EntityFrameworkCore.MySql -OutputDir MyModel -Force
自动生成指定的mysql数据库实体类。其中,MyModel是需要生成的目标目录文件夹。

通过命令:
Scaffold-DbContext "Oracle连接字符串" Oracle.EntityFrameworkCore -OutputDir OraModel -Force
自动生成Oracle数据库实体类。

通过命令:
Scaffold-DbContext "pgsql连接字符串" Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir PgModel -Force
自动生成PostgreSQL数据库实体类。

新建一个测试服务类DatabaseTestService,提供简单插入和更新功能:

在minimai api项目里,新增两个简单的测试API用于测试。为了简单,就直接实例化一下进行访问,然后返回执行结果。

以上方法可能执行适合会导致耗时而失败,为了直观一点,改成控制台里面输出。

实现里面也做点调整。

测试插入和更新
运行程序以后,对三个数据库分别插入数据并计时。
先看Oracle物理表情况。
插入总共数据条数:

部分数据结果集:

然后是mysql物理表数据。
插入数据总数:

部分数据结果集:

最后是PostgreSQL。插入总条数:

部分数据结果集:

以下是通过EF CORE进行插入的结果:

接下来进行一轮更新操作,为了防止数据量太大,所以只进行批量更新10000条数据。结果如下:

看下数据更新结果是不是正常。
Oracle数据:

MySQL数据:

PGSQL数据:

数据库数据清空,屏蔽掉C#代码一些实体赋值时间,重新执行两次仅统计批量插入数据库部分的执行的时间进行重新测试,仅测试批量插入耗时结果。
第一回测试结果:

接下来不删除数据,重新执行一轮。

Oracle估计哪儿有问题,数据让人很尴尬啊。接下来只比较MySQL和PgSQL
来一波批量插入:

再来一波三次的批量更新:

以上测试至此就结束了。结论可能有点尴尬,也许跟环境配置有关,也可能跟ef core操作数据库的支持与实现有关。并且当前仅在单表环境下测试,并没有通过多表测试、存过测试、压力测试等,结果仅供娱乐和参考。同时欢迎各位大佬们提供更多测试内容,也欢迎各位大佬转发或评论或点赞等一键三连。
本文原链接:https://www.cnblogs.com/weskynet/p/16097151.html
如果有兴趣一起探讨.NET技术,也可以点击我的原博客地址,然后点击最下方加入QQ群聊按钮加入Q群聊,或者也可以加我个人微信号【WeskyNet001】,通过后也可以拉你进微信群一起学习。
【.NET 6】使用EF Core 访问Oracle+Mysql+PostgreSQL并进行简单增改操作与性能比较的更多相关文章
- 国产化之路-统信UOS + Nginx + Asp.Net MVC + EF Core 3.1 + 达梦DM8实现简单增删改查操作
		专题目录 国产化之路-统信UOS操作系统安装 国产化之路-国产操作系统安装.net core 3.1 sdk 国产化之路-安装WEB服务器 国产化之路-安装达梦DM8数据库 国产化之路-统信UOS + ... 
- net Core 通过 Ef Core 访问、管理Mysql
		net Core 通过 Ef Core 访问.管理Mysql 本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1. ... 
- .NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程
		本文首发于<.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程> 前言 在.NET Core/. ... 
- EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题
		小故事 在开始讲这篇文章之前,我们来说一个小故事,纯素虚构(真实的存钱逻辑并非如此) 小刘发工资后,赶忙拿着现金去银行,准备把钱存起来,而与此同时,小刘的老婆刘嫂知道小刘的品性,知道他发工资的日子,也 ... 
- Asp.net Core 通过 Ef Core 访问、管理Mysql
		本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1.0.0-preview2-003131 本文分为Window环 ... 
- ASP.NET CORE 使用 EF CORE访问数据库
		asp.net core通过ef core来访问数据库,这里用的是代码优先,通过迁移来同步数据库与模型. 环境:vs2017,win10,asp.net core 2.1 一.从建立asp.net c ... 
- 8天掌握EF的Code First开发系列之2 简单的CRUD操作
		本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 创建控制台项目 根据.Net中的类来创建数据库 简单的CRUD操作 数据库模式更改介绍 本章小结 本人的实验环境 ... 
- 使用ef core自动生成mysql表和数据编码的问题
		mysql默认的编码是不支持中文的,需要改成utf8编码格式. 而我使用的Pomelo.EntityFrameworkCore.MySql组件生成mysql库和表,他是使用默认编码的. 网上大多说修改 ... 
- oracle函数自治事务解决不能增改删的语句操作
		CREATE OR REPLACE FUNCTION SEQ3 (v_bname in VARCHAR2) return NUMBER is pragma autonomous_transaction ... 
随机推荐
- jquery, js轮播图插件Swiper3
			轮播图插件Swiper3 HTML代码 如果只是简单的使用轮播图,直接复制我的html代码就可以. 如果想要高级一些,就自己去看文档吧 <!DOCTYPE html> <html l ... 
- egg-jwt的使用
			安装 npm install egg-jwt --save 配置 // config/config.default.js config.jwt = { secret: 'zidingyi', // 自 ... 
- C/C++读取SEGY文件(三)
			SEGY IO (IBM&PC) 本文档将介绍SEGY的读取与写入过程,其中包括IBM与PC两种数据格式的转换. 程序将调用IEEE2IBM.cpp文件完成IBM与PC格式的互相转换. 新建头 ... 
- 七天接手react项目 —— 生命周期&受控和非受控组件&Dom 元素&Diffing 算法
			生命周期&受控和非受控组件&Dom 元素&Diffing 算法 生命周期 首先回忆一下 vue 中的生命周期: vue 对外提供了生命周期的钩子函数,允许我们在 vue 的各个 ... 
- Activemq特性之持久化--LevelDB特性
			LevelDB持久性适配器使用LevelDB作为高性能的消息存储.它是一个基于文件的存储库,它使用了Google的LevelDB,将索引保存到包含消息的日志文件中.它经过优化,提供了比KahaDB更快 ... 
- 问鼎杯预赛web writeup
			1. php的一个精度问题,具体什么精度自己查. 2017.000000000001=2017 2016.999999999999=2017 直接拿谷歌浏览器访问那个链接就可以拿到flag 2. 访问 ... 
- linux鸟哥学习笔记
			Linux学习笔记 Linux档案权限和目录配置 目录如果没有x权限,则无法进入该目录 改变文件和属性 chgrp: 改变档案所属的群组 chown:改变档案的拥有者 chmod:改变档案的权限,SU ... 
- vs 2019 社区版 .net core 5.0 之  .net core ef 迁移问题方案
			问题一:Add-Migration 时出现 此类问题一般都是模型类主键标识问题增加KEY即可解决 报错: The entity type 'xxxx' requires a primary key t ... 
- 数字IC笔试题-芯源
			前言 由于最近开始找数字IC的工作,所以准备多练笔试题,下面贴上芯源笔试题,来源微信公众号<数字IC打工人> 参考资源: 1. mu_guang_ 2. 李锐博恩 3. 长弓的坚持 4. ... 
- uoj310【UNR #2】黎明前的巧克力(FWT)
			uoj310[UNR #2]黎明前的巧克力(FWT) uoj 题解时间 对非零项极少的FWT的优化. 首先有个十分好想的DP: $ f[i][j] $ 表示考虑了前 $ i $ 个且异或和为 $ j ... 
