.net PetaPoco插入-最快的方法?

.net PetaPoco插入-最快的方法?,.net,database,insert,petapoco,.net,Database,Insert,Petapoco,将记录插入数据库的最快选项是什么:使用以下哪项: Database.Insert(poco) Database.Insert(tableName,pkName,poco) Database.Save(poco) Database.Save(tableName、pkName、poco) 出于性能原因,我应该使用哪一个?一个对我来说并不比另一个更方便 谢谢。在您列出的所有4种方法中,对于INSERT,PetaPoco似乎总是调用数据库类的以下方法: public object Insert(st

将记录插入数据库的最快选项是什么:使用以下哪项:

  • Database.Insert(poco)
  • Database.Insert(tableName,pkName,poco)
  • Database.Save(poco)
  • Database.Save(tableName、pkName、poco)
出于性能原因,我应该使用哪一个?一个对我来说并不比另一个更方便


谢谢。

在您列出的所有4种方法中,对于INSERT,PetaPoco似乎总是调用数据库类的以下方法:

public object Insert(string tableName, string primaryKeyName, bool autoIncrement, object poco)
Database.Insert(tableName,pkName,poco)
做的工作最少(它基本上只是一个传递方法),因此我认为它是性能最好的方法

以下是插入(字符串、字符串、对象)的代码。:

直接调用
Insert(string,string,bool,object)
重载可能会稍微快一点(而且不明显)

出于性能原因,我应该使用哪一个

Database.Save
方法使用
GetValue
检索主键字段的值,然后调用
Database.Insert
Database.Update

因此,只有当您的代码确实需要保存对对象的更改时,才应该使用
Database.Save
。另外,请注意,表必须为
数据库提供一个自动递增的主键列。保存
才能工作

即使没有轻微的性能差异,我还是更喜欢正确的语义——使用插入或更新而不是保存

一个对我来说并不比另一个更方便

事实并非如此

Database.Insert(poco)
将在poco类定义的自定义属性中查找
tableName
pkName
的值。如果使用T4模板,这些值将自动与数据库保持同步,并且仅在一个位置指定。另一方面,如果在每个方法调用中传递它们,它们将在整个代码库中重复无数次。干的如果以后需要更改其中一个值,该怎么办

现在,
Database.Insert(poco)
的性能会因为这种查找而略有下降。但是,PetaPoco将该查找的结果缓存在静态字典中,因此在第一次查找之后,性能影响将非常小:

RWLock.EnterReadLock();
PocoData pd;
try
{
    if (m_PocoDatas.TryGetValue(t, out pd))
        return pd;
}
finally
{
    RWLock.ExitReadLock();
}

是的,通过这句话“一个对我来说并不比另一个更方便……”,我所做的补救是:违反了DRY,是的,但根据以下内容,它的性能更好:。我可能会尝试进一步定制…@BrianMains:你真的需要挤出额外的一点速度吗?我使用自定义的亚音速模板工作了一段时间(我们仍然在维护的应用程序中使用它们),这是一个累赘。无论如何,我想我已经在我的答案中清楚地列出了权衡。您当然可以选择更快的路线,而不是更容易维护的路线,但很少有用户真正需要它。最大的收益将来自批处理操作、准备好的语句、适当的索引等。但您所说的是超过500次迭代的9ms左右,因此性能损失可以忽略不计。数据库将成为映射代码之前的瓶颈。@BrianMains:在阅读您的博客文章时,我注意到的另一件事是,随着您使用的修改,您将放弃对poco的多态性进行操作的能力。例如,我在一个使用PetaPoco的项目中实现了一个UnitOfWork类,该类依赖于以多态方式跟踪所有更改的对象,即
对象,并一次提交所有更改。显然,您可能不需要这种能力,但这是一种折衷,例如,必须了解poco类才能使用
Users.GetTableName()
。@qes感谢您从各个角度对其进行研究。说真的,我很感激。是的,工作单元在许多流行的框架中实现,如实体框架L2SQL、NHibernate,这是一个很好的特性。对于大型对象图和跟踪大量更改的对象(使用EF时会遇到这种情况),它可能会导致一些性能问题。在我的场景中,这是一个简单的应用程序,所有这些都是多余的。但这篇文章的未来读者需要考虑一些问题。
RWLock.EnterReadLock();
PocoData pd;
try
{
    if (m_PocoDatas.TryGetValue(t, out pd))
        return pd;
}
finally
{
    RWLock.ExitReadLock();
}