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无关。请记住,指令被发送到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
注:谢谢你,塞尔吉奥。你的建议也很有帮助。