0

コードは次のとおりです。

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 ミリ秒かかります...

4

2 に答える 2

1

トランザクションのコミットにかかった時間は、NHibernate とは関係がない可能性があります。命令は DBMS (この場合は SQLite) に送信されるため、SQLite で処理時間が費やされることに注意してください。DB で他の操作を同時に実行していますか? トランザクションをコミットするとき、SQLite は DB でロックを取得する必要がありますが、これは影響を受けるテーブルのみである必要がありますが、このロックにより、DBMS は他のトランザクションが最初に終了するまで待機する必要があります。ここでは、SQLite でのコミット プロセスについてもう少し詳しく説明します。お役に立てれば。

http://sqlite.org/atomiccommit.html

于 2013-06-20T16:41:48.317 に答える
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

PS ありがとう、セルジオ。ご指摘も大変参考になりました。

于 2013-06-29T00:57:48.067 に答える