2008-12-01 6 views
0

Existe-t-il des optimisations à prendre en compte lors de la connexion à Oracle avec NHibernate? Mes appels à Oracle prennent énormément de temps. Si j'exécute la requête NHibernate (copiée à partir de ma fenêtre de sortie dans Visual Studio) directement sur Oracle, elle revient tout de suite en moins d'une seconde. Voici mon fichier de configuration pour NHibernate. Je peux poster les fichiers de mapping si nécessaire.Accélérer NHibernate Appels à Oracle?

<?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> 

Mise à jour: résumant toutes les discussions ici:

Si je supprime tous les many-to-one relations et il suffit d'exécuter mon test unitaire contre l'entité unique sans joint, la requête est exécutée encore plus de 2 minutes. Si je copie le sql généré par nhibernate et l'exécute directement sur oracle, la requête retourne en moins d'une seconde. Je poste aussi mon fichier de mapping ici. Y a-t-il quelque chose qui me manque qui pourrait causer cette disparité? La seule chose que je fais est de sélectionner par identifiant de compte. Bien que la table soit grande (plus de 5 millions de lignes), le champ de l'ID du compte client est indexé et la requête brute revient très rapidement.

<?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> 
+0

Comment gérez-vous les sessions et la fabrique de sessions à partir de votre application? – AlexCuse

+0

Combien de résultats la requête renvoie-t-elle? Il existe une différence entre l'exécution de la requête et la visualisation immédiate des résultats dans un outil SQL, la récupération de TOUS les résultats et le chargement dans des objets. – TheSoftwareJedi

+0

J'utilise 1 session par requête http. La fabrique de sessions est créée une fois pour la durée de vie de l'application. –

Répondre

0

Assurez-vous que votre piscine de connexion est suffisamment grande. En outre, si vous essayez de déboguer votre code, vous devriez être en mesure de voir où Hibernate passe la majorité de son temps. Il peut s'agir de traiter les résultats, comme quelqu'un l'a commenté plus tôt, surtout si vous avez des relations en cascade. Si vous le faites, essayez d'exécuter ces requêtes en utilisant subselect au lieu de lazy = false ou fetch = join, car cela sera probablement beaucoup plus rapide.