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

本文关键字:事务 提交 非常 SQLite NHibernate | 更新日期: 2023-09-27 18:19:09

代码如下:

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…

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

事务提交的时间可能与NHibernate无关。请记住,指令被发送到DBMS,在本例中是SQLite,因此,处理时间花在SQLite中。数据库中是否有其他并发操作?当提交一个事务时,SQLite必须在数据库上获得一个锁,虽然应该只在受影响的表上,但是这个锁导致DBMS必须等待其他事务先完成。下面是关于SQLite上提交过程的更多信息。希望这对你有所帮助。

http://sqlite.org/atomiccommit.html

最后,我找到了解决方案: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

注:谢谢你,塞尔吉奥。你的建议也很有帮助。