0

这是代码:

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-10 毫秒...

4

2 回答 2

1

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

http://sqlite.org/atomiccommit.html

于 2013-06-20T16:41:48.317 回答
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

PS谢谢你,塞尔吉奥。你的小费也很有帮助。

于 2013-06-29T00:57:48.067 回答