首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate和SQLite -非常慢的事务提交

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

Stack Overflow用户
提问于 2013-06-20 23:52:13
回答 2查看 1.2K关注 0票数 0

代码如下:

代码语言:javascript
复制
using (var session = NHibernateSessionFactory.OpenSession()) // 0ms
{
    using (var transaction = session.BeginTransaction()) // 0ms
    {
        session.Save(new Test() { Text = "..." }); // ~2ms
        transaction.Commit(); // 100-150ms!!
    }
}

日志输出:

代码语言:javascript
复制
...
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毫秒...

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-29 08:57:48

最后,我找到了解决方案:PRAGMA synchronous=off;只需将其传递到连接字符串:

代码语言:javascript
复制
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

另外,谢谢你,塞尔吉奥。你的提示也很有帮助。

票数 0
EN

Stack Overflow用户

发布于 2013-06-21 00:41:48

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

http://sqlite.org/atomiccommit.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17218235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档