2013-06-20 44 views
0

下面是代碼:NHibernate和SQLite的 - 很慢事務提交

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

最後,我找到了解決辦法: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

附:謝謝你,塞爾吉奧。你的提示也非常有幫助。

1

事務提交所需的時間可能與NHibernate無關。請記住,該指令被髮送到DBMS,在這種情況下,SQLite,因此,處理時間花在SQLite中。您是否同時在數據庫中運行其他操作?在提交事務時,SQLite必須在DB上獲得Lock,但應該只在受影響的表上,但是此鎖會導致DBMS必須先等待其他事務完成。這裏有一些關於SQLite提交過程的更多信息。希望這可以幫助。

http://sqlite.org/atomiccommit.html