保存到数据库的时间太长

本文关键字:时间 数据库 保存 | 更新日期: 2023-09-27 18:28:29

在我的应用程序中,我创建了一个userControl,然后需要将其保存到数据库中。这是我的方法,我保存我的用户控制:

private void SaveControl(byte userControlType, ISelectableViewModel viewModel, Guid guid)
{
    var context = new EntitiesNew();
    var instrumentSettings = new INSTRUMENTSETTINGS
                               {
                                   USERCONTROL = userControlType,
                                   INSTRUMENTHEIGHT = (float)viewModel.InstrumentHeight,
                                   INSTRUMENTWIDTH = (float)viewModel.InstrumentWidth,
                                   INSTRUMENTSCALABLEVALUE = viewModel.ScalableValue,
                                   INSTRUMENTPOSTOLEFT = (float)viewModel.InstrumentPosToLeft,
                                   INSTRUMENTPOSTOTOP = (float)viewModel.InstrumentPosToTop,
                                   INSTRUMENTZINDEX = viewModel.ZIndex,
                                   CREATED_BY= guid
                               };
    context.INSTRUMENTSETTINGSs.Add(instrumentSettings);
    context.SaveChanges();
    viewModel.ControlId = instrumentSettings.INSTRUMENTSETTINGSID;
    var roomId = (from room in context.ROOMs 
                 where room.ROOMNAME == viewModel.RoomName
                 select room.ROOMID).FirstOrDefault();
    var roomWithInstrument = new ROOMWITHINSTRUMENT
                         {
                             CREATED_BY = guid,
                             INSTRUMENTSETTINGSID = viewModel.ControlId,
                             ROOMID = roomId
                         };
    context.ROOMWITHINSTRUMENTs.Add(roomWithInstrument);
    context.SaveChanges();
}

没有任何错误,它正在工作。唯一的问题是,当我第一次将时间记录保存到数据库时,时间太长(比如2秒)。第一次保存后,效果会更好(不到一秒钟)。所以我的问题是——我如何提高第一次储蓄,这样才能更快地储蓄?

保存到数据库的时间太长

首先,您应该将上下文放在using块中

private void SaveControl(byte userControlType, ISelectableViewModel viewModel, Guid guid)
{
    using(var context = new EntitiesNew())
    {
        var instrumentSettings = //...
        //...
         context.SaveChanges();
    }
}

如果你不这样做,你就不会在完成后将连接释放回连接池,这可能会在程序运行时给你带来性能问题。

关于你的实际问题:实体框架在每个AppDomain第一次连接到数据库时会做很多额外的"事情"。您在调用第一个查询时就看到了这种情况,但是您可以使它更快地发生。

public static void InitializeDatabaseConnection()
{
    using(var context = new EntitiesNew())
    {
        context.Database.Initialize(false);
    }
}

该方法将初始化当前AppDomain的连接,并允许第一个查询更快。我只想在程序开始时在任务中运行这个方法。

public static void Main(string[] args)
{
    //Assumes you put the function inside the EntitiesNew class
    Task.Run(() => EntitiesNew.InitializeDatabaseConnection()); 
    Application.Run(new Form1());
}