【发布时间】:2010-03-26 20:54:30
【问题描述】:
我刚刚开始对我的 Fluent NHibernate / SQLite 项目进行一些实际性能测试,当我提交到数据库时遇到了一些严重的延迟。说真的,我的意思是花 20 - 30 秒来提交 30 K 的数据!
随着数据库的增长,这种延迟似乎会变得更糟。当 SQLite DB 文件为空时,提交几乎立即发生,但当它增长到 10 Meg 时,我看到了这些巨大的延迟。
数据库有 16 个表,每个表平均 10 列。
一个可能的问题是我存储了十几个 IList<float> 成员,但它们通常只有 200 个元素长。但这是 Fluent NHibernate 自动映射的最新功能,它将每个浮点数存储在单个表行中,所以这可能是一个潜在的问题。
有关如何追踪此问题的任何建议?我怀疑 SQLite 是罪魁祸首,但也许是 NHibernate?
我没有使用分析器的任何经验,但我正在考虑购买一个。我知道NHibernate Profiler - 对与 SQLite 配合良好的分析器有什么建议吗?
编辑
更多的测试表明,导致速度变慢的不是数据库的大小,而是取决于我启动程序后执行的保存次数。第一次保存的提交时间约为 300 毫秒,到第 50 次保存时超过 1000 毫秒。
我一直保持一个会话打开 - 也许我需要一些明确的刷新逻辑?
另外,我下载了 NHibernate Profiler。它为我的 IList 成员提供了有关“大量个人写入”的警报。警报描述建议打开批处理,但据我所知,SQLite 不支持。
还提到了 Multiquery 支持,所以我将继续阅读。
/编辑
这是保存数据的方法 - 如果您忽略所有错误处理和调试日志记录,它只是一个 SaveOrUpdate 调用和一个 Commit。
public static void SaveMeasurement(object measurement)
{
// Get the application's database session
var session = GetSession();
using (var transaction = session.BeginTransaction())
{
session.Save(measurement);
transaction.Commit();
}
}
【问题讨论】:
-
您是否正确使用事务?或者您是否有任何代码在添加新记录之前搜索现有记录?
-
@Kevin - 我想是这样,但我刚刚发布了一个代码片段 - 如果您发现任何问题,请告诉我。当我填充一个空数据库时,我看到了延迟 - 没有其他逻辑在寻找重复数据。
-
nhprof 与 sqlite 配合得很好
标签: nhibernate sqlite fluent-nhibernate