NHibernate和SQLite - 非常慢的事务提交

时间:2013-06-20 15:52:13

标签: c# sqlite nhibernate

以下是代码:

using (var session = NHibernateSessionFactory.OpenSession()) // 0ms
{
    using (var transaction = session.BeginTransaction()) // 0ms
    {
        session.Save(new Test() { Text = "..." }); // ~2ms
        transaction.Commit(); // 100-150ms!!
    }
}

日志输出:

...
2013-06-20 17:45:48,857 [DEBUG] [NHibernate.Impl.SessionImpl] - before transaction completion
2013-06-20 17:45:48,989 [DEBUG] [NHibernate.Transaction.AdoTransaction] - IDbTransaction Committed
...

为什么需要这么长时间?与PostgreSQL相同的代码导致~5-10ms ...

2 个答案:

答案 0 :(得分:1)

提交事务所花费的时间可能与NHibernate无关。请记住,该指令被发送到DBMS,在本例中是SQLite,因此,处理时间花费在SQLite中。您是否同时在DB中运行其他操作?提交事务时,SQLite必须获取DB上的Lock,尽管应仅在受影响的表上,但此锁定导致DBMS必须等待其他事务首先完成。以下是有关SQLite提交过程的更多信息。希望这可以帮助。

http://sqlite.org/atomiccommit.html

答案 1 :(得分:0)

最后,我找到了解决方案:PRAGMA synchronous=off; 只需将其传递给连接字符串:

var cfg = Fluently.Configure()
                        .Database(SQLiteConfiguration.Standard.ConnectionString("Data Source=db.sqlite;Version=3;PRAGMA synchronous=off;"))
                        .Mappings(m => m.AutoMappings.Add(CreateMappings));

更多信息:http://www.sqlite.org/faq.html#q19

P.S。谢谢你,塞尔吉奥。你的小费也非常有帮助。