PetaPoco Insert - 最快的方法?

时间:2011-12-31 19:00:35

标签: .net database insert petapoco

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

  • Database.Insert(poco)
  • Database.Insert(tableName, pkName, poco)
  • Database.Save(poco)
  • Database.Save(tableName, pkName, poco)

出于性能原因,我应该使用哪一个?一个人对我来说并不比另一个人方便......

感谢。

2 个答案:

答案 0 :(得分:10)

  

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

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

因此,当代码确实需要保存对可能是新的或预先存在的对象的更改时,您应该只使用Database.Save。另请注意,您的表必须有一个自动递增的主键列才能使Database.Save生效。

即使没有轻微的性能差异,我也更喜欢正确的语义 - 使用Insert或Update over Save。

  

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

事实并非如此。

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

现在,由于该查找,Database.Insert(poco)的性能稍差。但是,PetaPoco将查找结果缓存在静态字典中,因此在第一次查找后性能影响非常小:

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

答案 1 :(得分:3)

在您列出的所有4种方法中,对于插入,看起来PetaPoco总是调用Database类的以下方法:

public object Insert(string tableName, string primaryKeyName, bool autoIncrement, object poco)

并且Database.Insert(tableName, pkName, poco)执行的工作量最少(它基本上只是一种传递方法),所以我认为它是性能最佳的。

以下是Insert(string, string, object)的代码:

public object Insert(string tableName, string primaryKeyName, object poco)
{
    return Insert(tableName, primaryKeyName, true, poco);
}

直接调用Insert(string, string, bool, object)重载可能会稍微(并且不明显)更快。