架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 16|回复: 0

[交流] 【译】.NET/C# 中 MySqlConnector 和 MySql.Data 为什么前者胜出

[复制链接]
发表于 6 小时前 | 显示全部楼层 |阅读模式
在 C# 中使用 MySQL 数据库时,开发人员通常会选择 Oracle 官方的MySql.Data(MySQL 连接器/NET)包。然而,一个引人注目的替代方案应运而生,它不仅在几乎所有重要指标上都与官方连接器相当,甚至超越了它:MySqlConnector。

在这次全面的比较中,我们将探讨为什么 MySqlConnector 成为现代 C# 应用程序的首选,以及为什么您应该考虑进行切换。

两个连接器的故事

MySql.Data:官方但麻烦的选择

MySql.Data,正式名称为 MySQL Connector/NET,是 Oracle 官方的 MySQL ADO.NET 驱动程序。虽然它得到了官方的支持,但多年来也积累了许多问题:

  • GPL 2.0 的许可复杂性和商业许可要求
  • 负载下明显的性能瓶颈
  • 数十个悬而未决的漏洞已经存在多年
  • 季度发布,开发周期缓慢
  • 有限的服务器兼容性(仅限 MySQL 服务器)


MySqlConnector:社区驱动的替代方案

MySqlConnector 是 MySQL 协议的全新实现,它完全基于现代 .NET 实践构建。它并非基于 Oracle 的代码,而是直接实现了 MySQL 的线路协议,因此:

  • 真正有利于商业发展的MIT 许可
  • 所有基准测试均表现出色
  • 积极开发并定期发布
  • 与 MySQL 兼容服务器的更广泛的兼容性
  • 首先实现现代 .NET 功能


性能:MySqlConnector 的优势

这两个库之间的性能差异非常显著。最近对 MySqlConnector 2.3.1 和 MySql.Data 8.2.0 进行的基准测试显示:

  • 查询执行时间显著加快
  • 数据操作期间降低内存分配
  • 并发负载下吞吐量更高
  • 更高效的连接池


基准测试结果一致表明,MySqlConnector 在各种场景下(从简单查询到复杂的数据密集型操作)的性能均优于 MySql.Data。这并非微不足道的提升,而是足以显著提升应用程序的可扩展性。

许可:自由与限制

选择 MySqlConnector 最令人信服的理由之一是它的许可模式:

MySql.Data 许可挑战

MySql.Data 采用GPL 2.0许可证,但附带 Oracle 的通用 FOSS 例外条款。这带来了一些麻烦:

  • 商业应用程序可能需要从 Oracle 购买商业许可证
  • GPL 版权要求可能会影响您的整个应用程序
  • 发行和衍生作品的法律不确定性
  • 商业软件供应商的潜在成本


MySqlConnector 的 MIT 许可证

MySqlConnector 使用MIT 许可证,该许可证提供:

  • 完全自由的商业用途
  • 您的应用程序不受版权限制
  • 法律团队能够理解的清晰、简单的许可条款
  • 无论您的业务模式如何,都无需支付许可费用


对于大多数商业软件开发来说,仅此许可差异就足以证明转换是合理的。

Async:真正的异步编程

MySqlConnector 最显著的技术优势之一是其真正的异步实现:

MySql.Data 的异步问题

在 8.0.33 版本之前,MySql.Data 存在一个严重的缺陷:所有“异步”方法实际上都是返回已完成任务的同步操作。这意味着:

  • 没有真正的 I/O 并行性
  • 负载下线程池饥饿
  • 高并发场景下的扩展性瓶颈
  • 误导性的 API 契约看似异步,但实际上并非如此


MySqlConnector 的真正异步

MySqlConnector 实现真正的异步 I/O:

这使得现代异步/等待应用程序具有真正的可扩展性。

服务器兼容性:超越 MySQL

MySqlConnector 支持更广泛的 MySQL 兼容数据库生态系统:

MySql.Data 限制

  • 仅限 MySQL 服务器(与 MariaDB 10.10+ 存在兼容性问题)
  • 有限的云提供商支持
  • 没有针对 Aurora 的优化


MySqlConnector 的广泛兼容性

  • MySQL 5.5+ 和 8.x/9.x 系列
  • MariaDB 10.x 和 11.x
  • Amazon Aurora(经过特定优化)
  • Azure 数据库 for MySQL
  • 适用于 MySQL 的 Google Cloud SQL
  • Percona 服务器
  • 行星规模
  • 单存储数据库
  • TiDB


这种灵活性在现代云原生环境中至关重要,您可能需要在不同的 MySQL 兼容服务之间切换。

错误修复:十年来的问题已解决

MySqlConnector 修复了MySql.Data 中数十个长期存在的未解决的 bug 。以下是一些值得注意的例子:

连接和池管理

  • 连接池使用堆栈而不是队列(导致连接流失)
  • 返回池时连接未正确重置
  • 高连接场景下的内存泄漏


数据类型处理

  • TINYINT(1)不一致地返回不同类型
  • TIME和DATETIME精度问题
  • NULL在某些情况下对值的处理不正确


交易管理

  • 使用错误交易执行的命令
  • 影响整个会话的事务隔离级别
  • 分布式事务问题


准备好的语句

  • 准备好的语句的各种数据损坏问题
  • 某些类型的参数绑定不正确
  • 语句准备导致性能下降


现代 .NET 功能:引领潮流

MySqlConnector 始终首先实现新的 .NET 功能:

  • 第一个支持 .NET Core 的MySQL 驱动程序
  • DbBatch 支持(.NET 6.0)
  • DbDataSource 支持(.NET 7.0)
  • DateOnly 和 TimeOnly支持
  • 贯穿始终的现代异步模式


这种前瞻性的方法可确保您的应用程序可以立即利用最新的 .NET 功能。

迁移:比您想象的更容易

从 MySql.Data 切换到 MySqlConnector 很简单:

1. 更新软件包参考

2. 更新命名空间

3.更新连接字符串选项

大多数连接字符串保持不变,但一些默认值有所不同:

  • ConnectionReset=true默认情况下(更适合池化)
  • IgnoreCommandTransaction=false默认情况下(更严格的验证)
  • CharacterSet被忽略(始终使用 utf8mb4)


4. 处理重大变更

迁移指南记录了以下需要进行的具体更改:

  • 隐式类型转换
  • 异常类型
  • 参数处理
  • 事务范围行为


现实世界的影响:性能基准

在生产场景中,团队报告:

  • 查询执行时间加快 25-40%
  • 内存使用量减少 30-50%
  • 消除困扰MySql.Data 的超时问题
  • 更好的连接池利用率
  • 通过减少分配来降低 GC 压力


实体框架核心集成

MySqlConnector 通过 Pomelo 提供程序与 Entity Framework Core 无缝集成:

这种组合提供了出色的性能以及与 EF Core 最新功能的兼容性。

何时不该切换

虽然 MySqlConnector 在大多数情况下都表现优异,但在以下情况下,请考虑继续使用 MySql.Data:

  • 您正在使用非常旧的 .NET Framework 版本(尽管 MySqlConnector 支持 .NET Framework 4.6.1+)
  • 您有大量依赖于 MySql.Data 特定行为的自定义代码
  • 您的应用程序是旧版且稳定,没有性能问题
  • 您需要Oracle 商业支持合同


社区与发展

MySqlConnector 的优势在于:

  • 活跃的 GitHub 开发并定期发布版本
  • 维护人员响应迅速,能够快速修复错误
  • 全面的文档和示例
  • 开放的开发流程,任何人都可以做出贡献
  • 定期进行性能改进和优化


未来清晰可见

.NET MySQL 生态系统的趋势显而易见:MySqlConnector 代表了 .NET 应用程序中 MySQL 连接的未来。其卓越的性能、真正的异步实现、更广泛的兼容性以及对企业友好的许可,使其成为新应用程序的不二之选。

Oracle 的 MySql.Data 虽然是官方的,但却背负着遗留设计决策、许可复杂性以及较慢的创新步伐的包袱。对于以性能、可扩展性和开发人员体验为重点构建的现代应用程序而言,MySqlConnector 无疑是赢家。

进行切换

对于新项目,从一开始就选择 MySqlConnector。对于现有应用程序,请根据以下优势评估迁移工作量:

  • 高流量应用程序将立即获得性能提升
  • 云原生应用程序将受益于更好的兼容性
  • 商业软件将欣赏简化的许可
  • 现代 .NET 应用程序可以利用新功能


.NET 中的 MySQL 生态系统已然发展成熟,而 MySqlConnector 则代表着它的下一个发展篇章。问题不在于是否切换,而在于何时迁移到这个更优秀的库。

原文:超链接登录可见。




上一篇:.NET 10 在 Linux 以 Shebang 方式执行脚本
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-6-25 23:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表