代码如下:
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毫秒...
发布于 2013-06-29 08:57:48
最后,我找到了解决方案: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
另外,谢谢你,塞尔吉奥。你的提示也很有帮助。
发布于 2013-06-21 00:41:48
提交事务所用的时间可能与NHibernate无关。请记住,指令被发送到DBMS,在本例中为SQLite,因此处理时间花费在SQLite中。您是否有其他操作在数据库中并发运行?当提交一个事务时,SQLite必须在数据库上获得一个锁,虽然应该只在受影响的表上,但是这个锁导致数据库管理系统必须等待其他事务首先完成。下面是关于SQLite上提交过程的更多信息。希望这能有所帮助。
https://stackoverflow.com/questions/17218235
复制相似问题