以下是代码:
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 ...
答案 0 :(得分:1)
提交事务所花费的时间可能与NHibernate无关。请记住,该指令被发送到DBMS,在本例中是SQLite,因此,处理时间花费在SQLite中。您是否同时在DB中运行其他操作?提交事务时,SQLite必须获取DB上的Lock,尽管应仅在受影响的表上,但此锁定导致DBMS必须等待其他事务首先完成。以下是有关SQLite提交过程的更多信息。希望这可以帮助。
答案 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。谢谢你,塞尔吉奥。你的小费也非常有帮助。