我想知道为什么使用POCO和Devart DotConnect for Oracle时,代码片段1比代码2快。
我尝试了超过100000条记录,代码1比代码2快得多。为什么?我认为"SaveChanges“会清除缓冲区,使其更快,因为只有一个连接。我说错了吗?
代码1:
for (var i = 0; i < 100000; i++)
{
using (var ctx = new MyDbContext())
{
MyObj obj = new MyObj();
obj.Id = i;
obj.Name = "Foo " + i;
ctx.MyObjects.Add(obj);
ctx.SaveChanges();
}
}代码2:
using (var ctx = new MyDbContext())
{
for (var i = 0; i < 100000; i++)
{
MyObj obj = new MyObj();
obj.Id = i;
obj.Name = "Foo " + i;
ctx.MyObjects.Add(obj);
ctx.SaveChanges();
}
}发布于 2011-09-07 16:14:09
第一个代码片段的工作速度更快,因为每次都会从池中获取相同的连接,因此在重新打开连接时不会造成性能损失。
在第二种情况下,100000个对象逐渐添加到上下文中。使用缓慢的基于快照的跟踪(如果没有动态代理)。这将导致检测每个SaveChanges()上的任何缓存对象是否发生了任何更改。每一次后续迭代都会花费越来越多的时间。
我们建议您尝试以下方法。它应该有比上面提到的更好的性能:
using (var ctx = new MyDbContext())
{
for (var i = 0; i < 100000; i++)
{
MyObj obj = new MyObj();
obj.Id = i;
obj.Name = "Foo " + i;
ctx.MyObjects.Add(obj);
}
ctx.SaveChanges();
}编辑
如果您使用一种在一个SaveChanges()中执行大量操作的方法,那么额外配置用于Oracle provider的Devart dotConnect的实体框架行为将非常有用:
// Turn on the Batch Updates mode:
var config = OracleEntityProviderConfig.Instance;
config.DmlOptions.BatchUpdates.Enabled = true;
// If necessary, enable the mode of re-using parameters with the same values:
config.DmlOptions.ReuseParameters = true;
// If object has a lot of nullable properties, and significant part of them are not set (i.e., nulls), omitting explicit insert of NULL-values will decrease greatly the size of generated SQL:
config.DmlOptions.InsertNullBehaviour = InsertNullBehaviour.Omit;这里只提到了一些选项。完整的列表可以在我们的文章中找到:http://www.devart.com/blogs/dotconnect/index.php/new-features-of-entity-framework-support-in-dotconnect-providers.html
假设当调用SaveChanges()时,缓存中的所有对象都存储到DB中,缓存被清除,因此每个循环都是独立的,这是错误的吗?
SaveChanges()将所有更改发送并提交到数据库,但对附加到上下文的所有实体继续跟踪更改。而新的SaveChanges,如果使用基于快照的更改跟踪,将启动一个漫长的检查过程(更改或未更改?)每个对象的每个属性的值。
https://stackoverflow.com/questions/7327824
复制相似问题