记开源项目:DotNetCore.CAP.MySql问题分析:only mysqlparameter objects may be stored

1.  简介

  最近在学习分布式事务及解决方案,最终找到了开源项目DotNetCore.CAP ,因为自己用的MySql数据库比较多。于是也使用MySQL+EFCore+RabbitMQ+CAP实现事务最终一致性,所有配置都已经ok,就在程序运行之后,请求接口,启动事务,调用CapPublish写入消息的时候报错了:only mysqlparameter objects may be stored,当时这个问题给我整的怀疑人生,以为是我自己哪里配置有问题。最后才发现原来是DotNetCore.CAP.MySQL引用的是MySqlConnector包,而EFCore用的是Mysql.Data包,最终导致报错,在此记录下自己的问题排查步骤。

1.  问题分析思路

  1. 第一步:检查项目配置

    说实话,当时看到这个错误,整个人就有点懵逼,第一反应是自己的配置出现了问题,认真的检查完成之后,发现整个项目配置没问题。

  2. 第二步:尝试其它代码

    然后整个人有点傻眼,就各种尝试,因为怀疑是自己事务用的有问题,尝试使用MysqlConnection来创建事务 以及 EF对象类的DataBase来开启事务。最终都得到上面的报错。

  3. 第三步:

    迫于无奈,只能去github下载源码,因为之前自己下载过CAP的源码,所以基本直接将源码拿过来研究,

记开源项目:DotNetCore.CAP.MySql问题分析:only mysqlparameter objects may be stored

      发现publish方法最终调用的是DotNetCore.CAP.MySQL里面的实现,来讲消息写入到数据库。然后就点开mysql的扩展:

记开源项目:DotNetCore.CAP.MySql问题分析:only mysqlparameter objects may be stored

   4. 调试源码:

    咋一看,没啥毛病,于是不死心,就把源码来到程序直接调试,然后还是报错,最终我点开这个MySqlParameter类,看到里面用的MySqlConnector这个包

记开源项目:DotNetCore.CAP.MySql问题分析:only mysqlparameter objects may be stored

  然后发现是这个包的问题,最终强迫症大于选择,坚持使用mysql,不想换成sqlserver,于是对项目进行换包,删除掉MySqlConnector包,换成MySql.Data,然后重新编译,执行。最终成功解决问题。

3.  解决方案

  1. 对项目:DotNetCore.CAP.MySQL源码进行修改,删除MySqlConnector包,安装MySql.Data。
  2. 解决DotNetCore.CAP.MySQL项目中的引用报错,重新编译,在调试,
  3. 完美解决

 4. 推荐使用Pomelo.EntityFrameworkCore.MySql

  因为MySql.Data包的异步是假的,我特地看了下MySql.data的源码,发现其异步方法内,最终执行sql还是同步。

  MysqlConnector与Mysql.Data对比,总体性能要高出。

  推荐使用 Pomelo.EntityFrameworkCore.MySql 支持,因该包内部使用的是MySqlConnector包