具有memcached和随机无效转换的高级缓存

我有一个使用nHibernatememcached作为二级缓存提供程序的MVC3应用程序。 我们一直在断断续续地(但最近频繁)得到奇怪的投射问题。 它随机发生并使memcached缓存无效将解决此问题。

它只发生在我们的生产环境中,因为我们不在其他环境中运行memcached。 然而,我在本地运行memcached,并试图在没有运气的情况下在本地执行此操作。

我们在Windows上使用memcached 1.2.6 。 这是堆栈跟踪。 我知道这不是足够的信息来确定任何东西,但如果任何人有任何想法我可以调试这将不胜感激。 我试图在我们的生产机器上进行远程调试,但这是一年的繁忙时间和风险。

Unable to cast object of type 'System.Int32' to type 'System.String'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'.]
   (Object , Object[] , SetterCallback ) +4270
   NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values) +80

[PropertyAccessException: Invalid Cast (check your mapping for property type mismatches); setter of MyApplication.Business.Data.Program]
   NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values) +207
   NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValues(Object entity, Object[] values) +97
   NHibernate.Cache.Entry.CacheEntry.Assemble(Object[] values, Object result, Object id, IEntityPersister persister, IInterceptor interceptor, ISessionImplementor session) +306
   NHibernate.Cache.Entry.CacheEntry.Assemble(Object instance, Object id, IEntityPersister persister, IInterceptor interceptor, ISessionImplementor session) +147
   NHibernate.Event.Default.DefaultLoadEventListener.AssembleCacheEntry(CacheEntry entry, Object id, IEntityPersister persister, LoadEvent event) +434
   NHibernate.Event.Default.DefaultLoadEventListener.LoadFromSecondLevelCache(LoadEvent event, IEntityPersister persister, LoadType options) +800
   NHibernate.Event.Default.DefaultLoadEventListener.DoLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) +560
   NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) +229
   NHibernate.Event.Default.DefaultLoadEventListener.ProxyOrLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) +438
   NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType) +943
   NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType) +99
   NHibernate.Impl.SessionImpl.Get(String entityName, Object id) +117
   NHibernate.Impl.SessionImpl.Get(Object id) +70
   MyApplication.Business.Repositories.Repository`1.Get(Object id) +148

我们遇到了同样的问题,我们已经将问题指向二级缓存中无效的缓存条目。 在我们的情况下,当我们从缓存在二级缓存中的表/实体中添加或删除列/属性并部署更改时,会出现问题。 代码需要5列(参数的缘故),而缓存存储6列。

我们在存储库中采用的一种策略是捕获异常并使缓存无效。 然后我们重试get。

    public override T Get(int id)
    {
        try
        {
            return base.Get(id);
        }
        catch (InvalidCastException)
        {
            _sessionFactory.EvictEntity(typeof (T).Name);
            return Get(id);
        }
    }

希望这可以帮助!


很可能这是由生产环境和本地查询返回的不同数据集造成的。 对象映射器获取的数据与期望的数据不同。 当试图转换数据时,你会得到这些例外。

链接地址: http://www.djcxy.com/p/12273.html

上一篇: level cache with memcached and random invalid casts

下一篇: form attempt to update while check multiple check boxes