首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Devart Oracle Entity Framework 4.1性能

Devart Oracle Entity Framework 4.1性能
EN

Stack Overflow用户
提问于 2011-09-07 08:59:40
回答 1查看 1.7K关注 0票数 0

我想知道为什么使用POCO和Devart DotConnect for Oracle时,代码片段1比代码2快。

我尝试了超过100000条记录,代码1比代码2快得多。为什么?我认为"SaveChanges“会清除缓冲区,使其更快,因为只有一个连接。我说错了吗?

代码1:

代码语言:javascript
复制
        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:

代码语言:javascript
复制
        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();
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-07 16:14:09

第一个代码片段的工作速度更快,因为每次都会从池中获取相同的连接,因此在重新打开连接时不会造成性能损失。

在第二种情况下,100000个对象逐渐添加到上下文中。使用缓慢的基于快照的跟踪(如果没有动态代理)。这将导致检测每个SaveChanges()上的任何缓存对象是否发生了任何更改。每一次后续迭代都会花费越来越多的时间。

我们建议您尝试以下方法。它应该有比上面提到的更好的性能:

代码语言:javascript
复制
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的实体框架行为将非常有用:

代码语言:javascript
复制
// 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,如果使用基于快照的更改跟踪,将启动一个漫长的检查过程(更改或未更改?)每个对象的每个属性的值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7327824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档