我无法在appfabric缓存中存储大的对象列表,该怎么办?

时间:2015-05-05 14:17:17

标签: c# caching appfabric large-data

我有一个包含10500个对象的列表。 当我试图把它放在缓存中时,这就成了一个例子。 然后我将列表对象数减少到9000,然后缓存工作正常。

那么有人可以告诉我如何将所有列表存储在缓存中吗?

下面的

是我的web.config中的dataCacheClient:

<dataCacheClient requestTimeout="600000" 
                  channelOpenTimeout="12000" 
                  maxConnectionsToServer="1">
<hosts>
  <host name="Platform.Almanhal.local" cachePort="22233" />
</hosts>

<transportProperties connectionBufferSize="131072" 
                     maxBufferPoolSize="568435456"
                     maxBufferSize="183886080" 
                     maxOutputDelay="2" 
                     channelInitializationTimeout="60000" />
</dataCacheClient>

以下是我用来存储此列表的appfabric api:

public T Data<T>(string cacheKey, int expirationSeconds, Func<T> method)
    {
        T data = default(T);
        try
        {
            string key = GetEncryptedKey(cacheKey);
            var cache = GetFromCache(key);

            data = cache == null ? default(T) : (T)cache;
            if (data == null)
            {
                data = method();
                if (expirationSeconds > 0 && data != null)
                {
                    lock (sync)
                    {
                        PutInCache(key, data, TimeSpan.FromSeconds(expirationSeconds));
                    }
                }
                Logger.LogInfo(string.Format("{0} Loaded From DB", typeof(T).GetProperties()[2].PropertyType.Name));
            }
            else
            {
                Logger.LogInfo(string.Format("{0} Loaded From Cache", typeof(T).GetProperties()[2].PropertyType.Name));
            }
        }
        catch (Exception ex)
        {
            Logger.LogInfo(ex.InnerException.Message);
        }
        return data;
    }

PutInCache功能如下:

 public void PutInCache(string key, object obj, TimeSpan tspan)
    {
        //TracingLibrary.TraceEvents.AddEvent("Inside Put in Cache");
        try
        {
            _cache.Put(key, obj, tspan);
        }
        catch (Exception e)
        {
            string msg = e.InnerException.ToString();
            Logger.LogInfo(string.Format("Cannot put object in cache {0}, \nException: {1} \nMessage:{2}", key, e.InnerException.ToNullOrString(), e.Message.ToNullOrString()));
            //write to logger ("Exception putting in cache", e.InnerException);
        }
    }

这是一个例外信息:

  

ErrorCode:SubStatus:暂时失败。   请稍后重试。 (一个或多个指定的缓存服务器是   不可用,这可能是由繁忙的网络或服务器引起的。对于   内部部署缓存集群,还验证以下条件。   确保已为此客户端授予安全权限   帐户,并检查是否允许AppFabric缓存服务   通过所有缓存主机上的防火墙。还有MaxBufferSize   server必须大于或等于序列化对象大小   从客户发送。)

1 个答案:

答案 0 :(得分:0)

答案在错误消息中:

  

服务器上的MaxBufferSize 必须大于或等于   从客户端发送的序列化对象大小

您可以在群集配置的advancedProperties部分中设置它:

<advancedProperties>      
    <transportProperties maxBufferSize="183886080" />
</advancedProperties>