我需要不断向数据库中添加数据,但要保持上下文同步

TheColonel26

我正在编写一个Windows服务,该服务在端口上侦听http消息。这些消息来自RFID标签读取器。侦听部分由一个封闭源API完成,我计划以后在需要时使用我自己的代码进行替换。我有一个事件处理程序,每次阅读器API收到消息时都会触发该事件处理程序。然后,它首先使用实体​​代码将数据添加到msSQL数据库。

问题是,到目前为止,我探索的两条路线都有很多缺点。

我可以在处理程序方法中创建上下文的本地实例,也可以创建类范围的实例。本地实例的问题在于,它每次运行时都必须缓存数据库(我认为),这似乎要花费大量时间。我使用秒表来计时功能开始到结束的时间。使用本地创建的上下文时,该函数最多可能需要3分钟才能运行。

另一个选择是使用类范围的实例,但是问题在于,缓存没有更新,因此,如果我更改数据库中的某些内容,该方法将看不到它。我在reader类中有一个bool属性,该属性确定是否发送电子邮件通知。

我已经定时了,平均运行时间约为5秒钟。

这是我的缩写eventHandler代码。随着第二条路线。

private DatabaseAPI databaseAPI; //** inherits from dbcontext
private static readonly object HandleMsgLock = new object();

private void handleMsgRecvEvent(string msg)
{
    lock (HandleMsgLock)
    {

        bool error = false;

        bool failed = false;

        NotifyInfo info = new NotifyInfo();

        AlienUtils.ParseNotification(msg, out info);

        Reader reader = databaseAPI.GetReader(info.MACAddress);

        if (reader != null)
        {
            Reading reading = new Reading();

            if (info.TagList != null)
            {

                //** fix me, this could use some improvements
                for (int i = 0; i < reader.Antennas.Count; i++) //** loop through each antenna
                {
                    reading = new Reading();

                    reading.Antenna = reader.Antennas.Where(x => x.AntennaNumber == i).SingleOrDefault();
                    reading.TargetNumOfTags = reading.Antenna.numOfTag;

                    List<ITagInfo> tagList = info.TagList.Where(x => x.Antenna == i).ToList();
                    if (tagList.Count == reading.Antenna.numOfTags)
                    {
                        log("- - - - - - -" + "\n");
                        log("TagStatus = OK \n");

                        reading.Status = Reading.StatusType.Pass;
                        reading.numOfTagsRead = (short)tagList.Count;
                    }
                    else
                    {
                        failed = true;
                        reading.Status = Reading.StatusType.Fail;
                        reading.numOfTagsRead = (short)tagList.Count;
                    }

                    foreach (ITagInfo t in tagList)
                    {
                        Tag tag = databaseAPI.GetTag(t.TagID);

                        if (tag == null)
                        {
                            tag = databaseAPI.CreateTag(t.TagID, reading);
                        }
                        else
                        {
                            //** if tag number does exist add reading to it
                            tag.Readings.Add(reading);
                        }

                        tag.TagID = t.TagID;
                        reading.Tags.Add(tag);
                    }

                    reading.Reader = reader;
                    reading.TimeStamp = DateTime.Now;
                    databaseAPI.Readings.Add(reading);

                    if (failed)
                    {
                        handleShoeFailed(reading);
                    }
                    else
                    {
                        handleShoePassed(reading);
                    }

                    log("TagsRead: " + tagList.Count + " out of " + reading.Antenna.numOfTags + "\n");

                }//** end for loop

            }//** end taglistCount not null
            else
            {
                reading.Antenna = null;
                reading.Status = Reading.StatusType.None;
                reading.TargetNumOfTags = reader.numOfTags;
                reading.Reader = reader;
                reading.TimeStamp = DateTime.Now;
                databaseAPI.Readings.Add(reading);

                failed = true;
                handleShoeFailed(reading);
            }

            databaseAPI.SaveChanges();                            

        }//** end if reader not null
        else if (reader == null)
        {
            log("Received Msg from Unknown Reader: " + info.ReaderName + ", IP: " + info.IPAddress + ", MAC: " + info.MACAddress);
        }

    }//** end lock

    stopWatch.Stop();
    log("StopWatch: (" + stopWatch.Elapsed);
    log("- - - - - - -" + "\n");

}//** end msg handler

还有其他选择吗?

伯特·哈里斯(Burt_Harris)

我从您的帖子中推断出,您正在将此信息存储在关系数据库(可能是MS SQL Server)中,并且消息传输率相当高,并且数据库大小足够大,足以将SQL中的数据检索到dbcontext中。放慢脚步。

有了这些,以及我在C#中看到的逻辑,我将建议一种截然不同的方法:编写SQL存储过程以执行标记为改进的部分中的逻辑。目标应该是处理每条消息仅需要往返数据库服务器一次。我的期望是存储过程应该能够在亚秒级的时间内运行,因为SQL Server本身非常擅长缓存。

这可能需要学习有关Transact-sql的知识,但是我建议您花很多时间来投资它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

向数据库上下文添加新字段时出错

来自分类Dev

为什么我的数据库上下文被处置

来自分类Dev

我可以创建一个可以添加到数据库中的模拟数据库上下文,然后进行搜索吗?

来自分类Dev

首先将现有视图添加到代码中数据库上下文?

来自分类Dev

将对象列表添加到Entity Framework中的数据库上下文

来自分类Dev

向数据库PHP添加数据

来自分类Dev

向MySQL数据库添加数据的首选方法

来自分类Dev

为什么我不能向wp数据库添加数据(行和值)?

来自分类Dev

每次我在ASP.NET MVC中调用动作时都会创建数据库上下文

来自分类Dev

Light在MVC中注入数据库上下文

来自分类Dev

静态数据库上下文混乱

来自分类Dev

Glass上下文数据库null

来自分类Dev

Linq Sql数据库上下文丢失方法

来自分类Dev

使用不同的上下文访问数据库

来自分类Dev

数据库上下文中缺少GetTable <TEntity>()

来自分类Dev

Glass上下文数据库null

来自分类Dev

SignalR 和数据库上下文处理

来自分类Dev

在我的域模型中有数据库上下文是否可以

来自分类Dev

上下文为空,所以我无法打开数据库

来自分类Dev

从我的数据库上下文中基于ID删除用户

来自分类Dev

在我的域模型中有数据库上下文可以吗

来自分类Dev

在Django中向创建的sqlite数据库添加数据

来自分类Dev

Livewire不显示数据库中的数据。好吧,如果我添加数据的话

来自分类Dev

我的表单未向数据库添加数据-Django

来自分类Dev

MVC使用上下文在数据库中查找记录

来自分类Dev

在ASP.Net MVC中合并多个数据库上下文

来自分类Dev

OrientDB在上下文错误中找不到数据库实例?

来自分类Dev

如何在控制器中获取数据库上下文

来自分类Dev

无法在数据库msbotframework nodejs中存储上下文对象

Related 相关文章

  1. 1

    向数据库上下文添加新字段时出错

  2. 2

    为什么我的数据库上下文被处置

  3. 3

    我可以创建一个可以添加到数据库中的模拟数据库上下文,然后进行搜索吗?

  4. 4

    首先将现有视图添加到代码中数据库上下文?

  5. 5

    将对象列表添加到Entity Framework中的数据库上下文

  6. 6

    向数据库PHP添加数据

  7. 7

    向MySQL数据库添加数据的首选方法

  8. 8

    为什么我不能向wp数据库添加数据(行和值)?

  9. 9

    每次我在ASP.NET MVC中调用动作时都会创建数据库上下文

  10. 10

    Light在MVC中注入数据库上下文

  11. 11

    静态数据库上下文混乱

  12. 12

    Glass上下文数据库null

  13. 13

    Linq Sql数据库上下文丢失方法

  14. 14

    使用不同的上下文访问数据库

  15. 15

    数据库上下文中缺少GetTable <TEntity>()

  16. 16

    Glass上下文数据库null

  17. 17

    SignalR 和数据库上下文处理

  18. 18

    在我的域模型中有数据库上下文是否可以

  19. 19

    上下文为空,所以我无法打开数据库

  20. 20

    从我的数据库上下文中基于ID删除用户

  21. 21

    在我的域模型中有数据库上下文可以吗

  22. 22

    在Django中向创建的sqlite数据库添加数据

  23. 23

    Livewire不显示数据库中的数据。好吧,如果我添加数据的话

  24. 24

    我的表单未向数据库添加数据-Django

  25. 25

    MVC使用上下文在数据库中查找记录

  26. 26

    在ASP.Net MVC中合并多个数据库上下文

  27. 27

    OrientDB在上下文错误中找不到数据库实例?

  28. 28

    如何在控制器中获取数据库上下文

  29. 29

    无法在数据库msbotframework nodejs中存储上下文对象

热门标签

归档