加速NHibernate对Oracle的调用?

时间:2008-12-01 14:50:13

标签: oracle nhibernate

使用NHibernate连接Oracle时是否需要考虑优化?我对甲骨文的打电话花了很长时间。如果我直接针对Oracle运行NHibernate查询(从我在Visual Studio中的输出窗口中复制),它会在一秒钟之内回来。这是我的NHibernate配置文件。如果需要,我可以发布映射文件。

<?xml version="1.0" encoding="utf-8" ?>
<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.OracleDialect</property>
        <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
        <property name="connection.connection_string">Data Source=****;Persist Security Info=True;User ID=******;Password=*******;Unicode=True</property>
        <property name="show_sql">true</property>
        <mapping assembly="AQTool.BL"/>
    </session-factory>
</hibernate-configuration>

更新: 总结了这里的所有讨论:

如果我删除所有多对一关系并且只针对没有连接的单个实体运行我的单元测试,则查询仍会运行超过2分钟。如果我复制nhibernate生成的sql并直接对oracle运行它,查询将在一秒钟内返回。我也在这里发布我的映射文件。我有什么遗漏可能会导致这种差异吗?我唯一要做的就是按帐户ID进行选择。虽然表格很大(超过5M行),但客户帐户ID字段已编制索引,原始查询会很快恢复。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="AQTool.BL" assembly="AQTool.BL" default-lazy="true">
    <class name="AQTool.BL.EmailAddress,AQTool.BL" table="EMAIL_CUSTOMER_ADDRESSES">
        <id name="EmailAddressId" column="EMAIL_ADDRESS_ID" type="int">
            <generator class="native" />
        </id>
        <property name="CustomerAccountId" column="CUSTOMER_ACCOUNT_ID" type="string" />
        <property name="EmailAddressText" column="EMAIL_ADDRESS_TX" type="string" />
        <property name="EmailAddressTypeId" column="EMAIL_ADDRESS_TYPE_ID" type="int" />
        <property name="EmailAddressTypeIdInternal" column="EMAIL_ADDRESS_TYPE_ID_INTERNAL" type="int" />

    </class>
</hibernate-mapping>

2 个答案:

答案 0 :(得分:1)

您可以考虑使用此工具进行“调试NHibernate” NHibernate Query Analyzer

答案 1 :(得分:0)

确保您的连接池足够大。此外,如果您尝试调试代码,您应该能够看到Hibernate在大部分时间内花费的时间。它可能与处理结果一样,如前所述,特别是如果您有级联关系。如果您这样做,请尝试使用subselect而不是lazy = false或fetch = join运行这些查询,因为这可能会明显加快。