NHibernate:OracleまたはPostgreSQLで作業するときのちょっとしたトリック

OraclePostgreSQLなどの ADO.NETプロバイダーには、サーバーから大量のデータを要求した場合にアプリケーションのパフォーマンスに影響を与える可能性のある不快な機能が1つあります。IDataReader.GetOrdinalメソッドの呼び出しをキャッシュしません。 判明したように、これはNHibernateにとって非常に重要ですが、幸いなことに、NHibernate(またはHibernate )の開発者はこの問題に気付き、すでに解決しています。



しかし、この機能は気付かれず、ほとんど文書化されていません。



NHibernateでIDataReader.GetOrdinalの呼び出しキャッシュを有効にするには、hibernate.cfgでオプション「adonet.wrap_result_sets」をtrueに設定する必要があります。



<?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <!-- other options --> <session-factory name="MySessionFactory"> <!-- other session factory options --> <property name="adonet.wrap_result_sets">true</property> </session-factory> </hibernate-configuration>
      
      







FluentNHibernateを使用すると、次のようになります。



 var config = Fluently.Configure() .ExposeConfiguration(c => c.SetProperty(Environment.WrapResultSets, "true")) .Database(db) /* other configuration */ .BuildConfiguration();
      
      







_ExposeConfiguration_メソッドは、 BuildConfigurationメソッドが呼び出されたときにNHibernate.Cfg.Configurationオブジェクトで呼び出されるアクションを追加します。 したがって、上記のコードは次のようになります。



 var config = Fluently.Configure() .Database(db) /* other configuration */ .BuildConfiguration(); config.SetProperty(NHibernate.Cfg.Environment.WrapResultSets, "true");
      
      







関連リンク





All Articles