我正试图将一个约60MB的对象放入一个缓存项中,但我经常遇到以下错误
ErrorCode<ERRCA0016>:SubStatus<ES0001>:The connection was terminated, possibly due to server or network problems or serialized Object size is greater than MaxBufferSize on server. Result of the request is unknown.. Additional Information : The client was trying to communicate with the server: net.tcp://127.255.0.0:20004/.
起初,错误指示了一个特定的大小,很明显客户端无法发送这么大的消息,所以我使用愚蠢的增加了客户端中的MaxBufferSize
<transportProperties maxBufferSize="999999999"/>
谷歌搜索和SO搜索提供了有关缓存角色配置的有限资源(大多数结果都提示更改web角色的web.config或类似内容)即使是微软的文档也是有限的。
是否可以增加缓存角色可以缓存的消息的最大大小,如果可以,如何增加?
您只更改了缓存客户端配置设置。可能在您的app.config/web.config下:
<dataCacheClients>
<dataCacheClient name="default">
<transportProperties maxBufferSize="XXXXX" />
</dataCacheClient>
</dataCacheClients>
现在缓存客户端允许调用,但服务器失败了。您还需要为服务器设置maxBufferSize。要执行此
- 右键单击您的角色
- 添加->新建项目->XML文件
- 将其命名为"CacheSettings.xml"
- 粘贴以下XML:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="dataCache" type="Microsoft.ApplicationServer.Caching.DataCacheSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere" />
</configSections>
<dataCache size="Small">
<advancedProperties>
<transportProperties maxBufferSize="XXXX" maxBufferPoolSize="XXXX" />
</advancedProperties>
</dataCache>
</configuration>
自2013年7月5日以来,缓存似乎一直存在问题。在一个应用程序上,我们设置了缓冲区大小,这解决了问题,但在另一个应用软件上,这没有帮助。不过,这些错误似乎是暂时的。尽管它不能完全解决问题,但重试会阻止应用程序崩溃。我们放入了类似于下面清单的代码,暂时掩盖了我们遇到的问题。
try
{
_cache.Value.Put("key", obj);
}
catch (DataCacheException e)
{
if (e.ErrorCode == 17)
{
Thread.Sleep(250);
_cache.Value.Put("key", obj);
}
else
{
throw;
}
}
上面检查的错误17,但16应该是类似的。您还需要在执行此操作时登录,这样您就不会忘记仍然存在问题。
正如Abhinav前面提到的,对象的最大大小是8MB。缓存用于快速访问经常使用的小型对象。如果您确实需要存储大型对象并快速使用它们,则应该考虑表存储。就性能而言,它是最接近Cache的。
或者,将数据存储在不同的块中,并创建一个单例/静态facade接口,该接口可以为您提供单独的组件,或者构造一个具体的对象并根据需要返回它。
序列化后,可以缓存的单个对象的最大大小为8MB。没有办法让缓存库将更大大小的对象放入缓存。
相反,您可以尝试将客户端中的对象拆分为多个(在本例中为6个)对象,但这确实很混乱。
如果你真的不能忍受8MB的限制,你应该在这里提交一个功能请求。