【问题标题】:NHibernate.ISession.Flush() is taking a long time after a Delete()-OperationNHibernate.ISession.Flush() 在 Delete() 操作后需要很长时间
【发布时间】:2010-11-28 12:49:45
【问题描述】:

在我的应用程序中,我想在我的 SQLite-DB 中清除/清空一个表(这是唯一的一个)。 我正在用 C# 编程。 _session 是 NHibernate.ISession 类型。这是我的代码:

string queryFmt = "FROM {0}"; 字符串查询 = String.Format(queryFmt, typeName); _session.Delete(查询);
_session.Flush();

我的示例数据库包含超过 5000 个条目(s3db 文件大约 750KB 大)。 Flush() 方法需要 6 分钟以上。 (当我在 SQLite Administrator 中执行删除操作时,只需不到一秒钟。)

我怎样才能更快地清空桌子?

【问题讨论】:

    标签: nhibernate flush


    【解决方案1】:

    对 hql 查询使用 ExecuteUpdate 这是一个例子:

    using(var session = sessionFactory.OpenSession())
    {
    
        String hqlDelete = string.Format("delete {0} t",typename);
        int deletedEntities = session.CreateQuery( hqlDelete ).ExecuteUpdate();
        session.Close();
    }
    

    【讨论】:

    • 一个小改动:它是“session.CreateQuery...”而不是“hqlDelete.CreateQuery...”
    【解决方案2】:

    如果你在配置中设置nhib为show_sql=true,输出的sql是什么?


    在您回复后,您可以看到 nhib 需要很长时间,因为它不是批量删除行。

    Ayende 有一个帖子解释它here.

    【讨论】:

    • for session.Delete(...):NHibernate:选择logentry0.Id为Id22_,logentry0_.Message为Message22_,logentry0_.Type为Type22_,logentry0_.Category为Category22_, logentry0_.DateCreated as DateCrea5_22_, logentry0_.Level as Level22_ from Log logentry0_ ============ for _session.Flush(): NHibernate: DELETE FROM WHERE Id = @p0;@p0 = 1 NHibernate: 从日志中删除 Id = @p0;@p0 = 2 ... NHibernate: 从日志中删除 Id = @p0;@p0 = 99 NHibernate: 从日志中删除 Id = @p0;@p0 = 100跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2013-09-07
    • 2020-08-26
    • 2014-10-09
    • 2012-11-26
    相关资源
    最近更新 更多