hangfire的 hangfireset表 ID 总是莫名自增,ID消耗很快,请问有谁知道这是为什么吗?

新手上路,请多包涵

hangfire的 hangfireset表 ID 总是莫名自增,ID消耗很快,请问有谁知道这是为什么吗?

另外想请教下 hangfire 自动生成的表都有什么用途呢?

网上没找到对应的资料

阅读 1.7k
1 个回答
新手上路,请多包涵

已解决了,原因是 hangfire.MysqlStorage 的 MySqlWriteOnlyTransaction.cs 中AddToSet 方法执行ON DUPLICATE KEY UPDATE 导致的,AddToSet 方法是每次执行任务时,会去检查HangfireSet表是否已有任务记录,有则更新下一次任务执行时间,他通过唯一约束索引作为条件来决定insert 或者 update,但不管是insert 还是 update,只要执行过,表的自增ID都会自行增加1;

将AddToSet 方法改为如下代码,然后将hangfire.MysqlStorage改变版本号,生成DLL,将DLL引入到代码中替换hangfire.MysqlStorage的Nuget包,注意版本号要和hangfire.MysqlStorage的Nuget包的版本号一致;

        public override void AddToSet(string key, string value, double score)
        {
            Logger.TraceFormat("AddToSet key={0} value={1}", key, value);

            AcquireSetLock();
            QueueCommand(x =>
            {
                var editExec = x.Execute(
                 $"UPDATE `{_storageOptions.TablesPrefix}Set` SET `Score` = @Score WHERE `Key` = @key and `Value` = @value",
                 new { key, value, score });
                if (editExec == 0)
                {
                    x.Execute(
                     $"INSERT INTO `{_storageOptions.TablesPrefix}Set` (`Key`, `Value`, `Score`) " +
                     "VALUES (@Key, @Value, @Score) " +
                     "ON DUPLICATE KEY UPDATE `Score` = @Score",
                     new { key, value, score });
                }
            });
        }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进