2012-09-24 102 views
1

我最近升級了我們的應用程序以使用NHibernate 3.3並希望啓用緩存。NHibernate 3.3查詢緩存引發異常

我們處於多租戶環境,所以我希望每個會話工廠都爲每個客戶保留一個區域。

這裏是我的NHibernate的配置:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> 
    <property name="cache.use_query_cache">true</property> 
    <property name="cache.use_second_level_cache">true</property> 
    <property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider,NHibernate.Caches.SysCache</property> 
    <property name="connection.connection_string">Data Source=localhost; database=test;user=test; password=test;</property> 
    <property name="show_sql">false</property> 
    <property name="command_timeout">1000</property> 
    </session-factory> 
</hibernate-configuration> 

,並在我們的會話工廠發電機...

private static ISessionFactory GetSessionFactory(string connectionString, string driverClass = NormDriverClass, string prefix = null) 
    { 
     Configuration configuration = new Configuration(); 
     configuration.Configure().SetProperty(ConnectionStringProperty, connectionString); 
     configuration.Properties.Add(ConnectionDriverProperty, driverClass); 
     configuration.Properties.Add("regionPrefix", prefix ?? "default"); 
     configuration.AddAssembly(typeof(Foo).Assembly); 

     return configuration.BuildSessionFactory(); 
    } 

我已經設置了查詢可緩存:

query.SetCacheable(true).SetCacheMode(CacheMode.Normal); 

我得到每次出現以下錯誤

System.IndexOutOfRangeException : Index was outside the bounds of the array. 
at NHibernate.Type.TypeHelper.Disassemble(Object[] row, ICacheAssembler[] types, Boolean[] nonCacheable, ISessionImplementor session, Object owner) 
at NHibernate.Cache.StandardQueryCache.Put(QueryKey key, ICacheAssembler[] returnTypes, IList result, Boolean isNaturalKeyLookup, ISessionImplementor session) 
at NHibernate.Loader.Loader.PutResultInQueryCache(ISessionImplementor session, QueryParameters queryParameters, IType[] resultTypes, IQueryCache queryCache, QueryKey key, IList result) 
at NHibernate.Loader.Loader.ListUsingQueryCache(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) 
at NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList results) 
at NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters, IList results) 
at NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters) 
at NHibernate.Impl.SqlQueryImpl.List() 

思考緩存提供商是罪魁禍首,我切換回

<property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider,NHibernate</property> 

沒有變化。

我刪除了區域前綴碼,沒有變化。

將「Use_query_cache」設置爲false可修復運行時異常,但不會使用緩存。

回答

0

同樣的問題在這裏。 我已經下載了源代碼並進行了一點調試,問題似乎在覈心模塊中。

我在Jira上創建了issue,剛剛意識到其他人在幾個月前完成了same

+0

我已經通過工作和原來公共類CustomLoader:裝載機 \t { \t \t //目前*不*被緩存,如果自動發現類型是影響(如「選擇* ...」) 應該有給我打翻了。 也就是說,我已經開始工作了,看起來我會爲這個問題修復。它需要更多的測試,但我會留下另一條評論並鏈接到Github Fork上。 – ClutchDude

+0

@ClutchDude:酷。讓我知道,因爲我仍然在爲這個問題而努力。 – LeftyX

+0

我已經完成了一個初步修復。我將在下週清理它並進行更多測試。一旦足夠穩定,我會做一個拉動請求。 https://github.com/Seakip18/nhibernate-core/tree/Branch_3.3.2GA_CacheFix – ClutchDude