繁体   English   中英

NHibernate性能

[英]NHibernate Performance

如果NHibernate是一个更复杂的对象,并且数据库中已经包含一些数据,则使用NHibernate进行获取+删除该对象的速度非常慢。

例:
-ObjectA(数据库中约150.000条目)-ObjectB引用ObjectA(数据库中约200.000条目)-ObjectC(与ObjectA一对一关系)-ObjectD(与ObjectC一对多关系,约800.000条目)

删除ObjectA也会删除上面列出的所有其他对象。 删除100个ObjectA大约需要12秒钟。 NHibernate这么慢可能是什么问题?

如果我在一个空的数据库上删除相同数量的对象,则只需大约1-2秒。

在大约20到30个对象之后,我已经尝试过刷新+清除会话,但这并没有太大的区别。

使用NHibernate删除100个对象要比直接执行DELETE语句(在空数据库上)慢。 在将对象转换为C#实体的过程中,总会有一些开销。

但是,当我们需要删除数十个对象而无需将它们加载到应用程序中时,NHibernate对于这些情况有很好的解决方案: DML

13.3的摘录 DML风格的操作

...因此直接在数据库中进行操作(使用SQL数据操作语言(DML)语句:INSERT,UPDATE,DELETE)不会影响内存中的状态。 但是,NHibernate提供了通过Hibernate查询语言(HQL)执行的用于批量SQL样式DML语句执行的方法。

文档中的代码示例:

ISession session = sessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();

string hqlDelete = "delete ObjectA a where a.property = :someValue";

int deleteddEntities = s.CreateQuery( hqlDelete )
   .SetString( "someValue", someValue)
   .ExecuteUpdate();

tx.Commit();
session.Close();

在HQL语句中,我们具有对映射属性的完全访问权限。 但是该语句直接在数据库引擎上执行...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM