簡體   English   中英

保存到數據庫需要太長時間

[英]saving to database takes too long

在我的應用程序中,創建一個userControl,然后將其保存到數據庫中。 這是我保存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());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM