我目前遇到一个问题,我的一个基于 .Net 的 Windows 服务占用了太多内存。
我几乎肯定它与缓存实现有关,我决定使用“数据库”缓存技术,而问题在于我在服务启动时最初加载缓存值的方式。
这里的概念...
类别:服务 操作:开始
类:Cacheloader 操作:LoadCache
类:DataAccessLayer 操作:Store_Cache_in_DB
……别问我为什么,但是……
- A) Cacheloader 在服务“启动”方法中作为局部变量“新增”。
- B)DataAccessLayer 对服务是静态的(通过 IOC 的单例)
所以代码有点像这样
服务:
start()
{
_cacheLoader = new Cacheloader(_dataAccessLayer);
_cacheLoader.LoadCache();
}
缓存加载器:
LoadCache()
{
var entities = _dataAccessLayer.FindEntitiesForCache();
_dataAccessLayer.Store_Cache_in_DB(entities);
}
数据访问层:
Store_Cache_in_DB(List<Entity> entities)
{
using(someConnection)
{
stored entities in datatable
pass database to sproc that stores each entity
}
}
因此,我关心的是通过 Store_Cache_in_DB 方法传递给静态 DataAccessLayer 对象的“实体”。我想知道垃圾收集器是否不会以某种方式清理这些,因为它们以某种方式被静态类引用?如果是这种情况,首先将实体分配给局部变量是否会有所帮助...
数据访问层:
Store_Cache_in_DB(List<Entity> entities)
{
var cachedEntities = entities;
using(someConnection)
{
stored cachedEntities in datatable
pass database to sproc that stores each entity
}
}
...希望这能解决我的问题。如果这不是我的内存消耗如此之高的原因,还有其他想法吗?同样,我确信这种缓存技术是肇事者。
提前致谢!