Oracle 、
PostgreSQLなどの 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"> <session-factory name="MySessionFactory"> <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) .BuildConfiguration();
_ExposeConfiguration_メソッドは、
BuildConfigurationメソッドが
呼び出されたときに
NHibernate.Cfg.Configurationオブジェクトで呼び出されるアクションを追加します。 したがって、上記のコードは次のようになります。
var config = Fluently.Configure() .Database(db) .BuildConfiguration(); config.SetProperty(NHibernate.Cfg.Environment.WrapResultSets, "true");
関連リンク