zoukankan      html  css  js  c++  java
  • 记开源项目: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的源码,所以基本直接将源码拿过来研究,

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

       4. 调试源码:

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

      然后发现是这个包的问题,最终强迫症大于选择,坚持使用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包

      

  • 相关阅读:
    mwutil公用方法库——dateTool
    mwutil公用方法库文档——cookieTool
    mwutil 公用方法库文档 ——arrayTool
    localstorage封装!
    github commit 规范
    你好,C++(40)7.1 一切指针都是纸老虎:彻底理解指针
    你好,C++(39)6.4.4 依葫芦画瓢:用C++表达设计结果(下)
    你好,C++(38)从问题描述中发现对象的属性和行为 6.4 工资程序成长记:类与对象(上)
    你好,C++(37)上车的人请买票!6.3.3 用虚函数实现多态
    你好,C++(36)人参再好,也不能当饭吃!6.3 类是如何面向对象的
  • 原文地址:https://www.cnblogs.com/norain/p/15204112.html
Copyright © 2011-2022 走看看