我们正试图在VS2010和Oracle的项目中第一次使用nHibernate。
如果我们在这个项目中使用nHibernate,应用程序的性能是接受这个项目的关键标准吗?
我们正在通过POC。我们有一个250列的表,当试图插入500条记录时,应用程序就会死掉。
有人可以建议nHibernate与PL / SQL CRUD的性能比较。
不知道我们应该在nHibernate配置文件中使用哪个参数来获得最佳性能?
我们正在使用以下配置
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="DefaultSessionFactory">
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
<property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
<property name="??;</property>
<property name="show_sql">true</property>
<property name="use_proxy_validator">false</property>
</session-factory>
</hibernate-configuration>
感谢您的期待。
答案 0 :(得分:1)
Iridium建议关闭show_sql是一个很好的建议。如果您使用的是log4net,则应确保为NHibernate设置日志记录级别。如果您将级别设置为DEBUG应用程序范围,NHibernate将记录大量条目。
<logger name="NHibernate">
<level value="ERROR" />
</logger>
答案 1 :(得分:1)
如果您遇到严重的性能问题,我建议您的应用程序中有一些内容导致这种情况。它不仅仅是nhibernate而且使用其他东西会让它变得更好(除非你正在做与其他东西不同的事情)。首先要想到的是,您应该知道系统中的事务使用的隔离级别。根据您管理会话和事务处理的方式,您可能使用比您需要的更高的隔离级别并且不必要地锁定数据库实体。这可能会导致你描述的内容和死锁。 system.tranactions的默认隔离级别是可序列化的,这是一个很大的时间锁定,可能不是你想要的。您可以使用以下命令设置nhibernate生成的事务的默认值:
<add key="hibernate.connection.isolation" value="ReadCommitted" />
如果您使用的是system.transactions(transactionscope),则可以在构造函数中指定隔离级别。如果您使用的是wcf,则有属性和配置以及其他管理方法。在不了解您的应用程序的情况下,很难说更多,这实际上只是猜测这是否是您的问题。
答案 2 :(得分:0)
我知道你已经接受了一个答案,但无论如何都想扔掉我的2c。
首先,您在一条评论中的一天:
该应用程序将有超过300列
这很麻烦。如果你正在做的是报告,不要使用ORM,如果它没有报告,那么我会说你的数据库设计很差,没有理由有300列。我不了解Oracle,但是在SQL Server中,当行数达到8k以上时,您会在单独页面上的列中对性能产生影响。
生成的查询量很大。您最好使用存储过程而不使用ORM。
但我尝试使用4列实体,插入100行需要30秒,同样的插入需要2-3秒,正常的pl / sql插入查询
出现这种情况的原因有很多。如果您在数据库中生成标识,那么NHibernate必须引入另一个选择以检索要应用于刚刚插入的模型的Id。
让NHibernate生成身份可以通过HiLo或Guid / GuidComb加快速度。
为每个插入打开一个全新的会话在添加时也会很昂贵,为插入重用相同的会话,并将插入一起批处理而不是发送单个语句。 (我不知道Oracle是否支持像SQL Server这样的批处理)
无论哪种方式,您都没有提供代码来显示您的测试,以便向任何人说明为什么它对您来说很慢。 NH对99%的人们的需求表现得非常好。