[英]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.