使用cache中的数据,是引用了cache中的地址,还是使用cache中的数据new了对像?

zyzl 2008-11-21 09:59:27
为了提高效率,我将DataTable(dt1)放入了Cache中
Cache['dt']=dt1.ToString();

下次使用的时候可以用:
DataTable dt=(DataTable)Cache['dt'];

虽然在这个表达式中没有见到new字段,但我觉得,在使用Cache中的数据时,是用Cache中的数据重新new了一个DataTable对像,因为在DataTable的数据修改以后,还要再次对Cache中的数据赋值,Cache['dt']=dt2.ToString();

这问这个问题的原因是,如果是new了Cache中的数据,我的网站随着用户点击的增多,服务器的内存使用会不断的增加。如果只是引用的话就不存在这个问题,用户点击多并不会增加服务器内存的使用?

请大家指点迷津?!

...全文
276 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyzl 2008-11-21
  • 打赏
  • 举报
回复
感谢 ojekleen ,感谢 sp1234 !
ojekleen 2008-11-21
  • 打赏
  • 举报
回复
楼上为9楼,
ojekleen 2008-11-21
  • 打赏
  • 举报
回复
同楼上所说,如果你cache存的是string,即你的datatable 有tostring()操作存入缓存,在取出缓存值的时候是复制一份字符串值给你的变量。
如果你存的是datatable,是直接建立一个引用,所以你偶到你说的哪种情况只有在你现有的.tostring代码中出现的,如果是其他引用类型是不用修改cache的值,也不能重新赋值,cache的值会随着你引用的databable改变的。
cong1212 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ojekleen 的回复:]
cache就像一个可以控制的静态object集合,当你把你的datatable insert cache的时候,其实就是把你的对象的引用给了cache,.net在垃圾回收的时候就不会回收你的datatable,下次调用的时候只要强制类型转换回你的datatable就可以使用,
DataTable dt=(DataTable)Cache['dt'];
而你的dt仍是一个指向你的原数据集的引用,并非new,用户点击多并不会增加服务器内存的使用
[/Quote]

这楼的解释很正确
tgbd 2008-11-21
  • 打赏
  • 举报
回复
楼上的就是热心。
zyzl 2008-11-21
  • 打赏
  • 举报
回复
谢谢大家,结贴!
cyqlightrain 2008-11-21
  • 打赏
  • 举报
回复
不会增加开销
  • 打赏
  • 举报
回复
你的单引号也是不对的,应该是双引号。看来你提出问题前没有试过基本的代码可执行否。

并不是所有引用类型的对象都是这样“不用重新放入Cache”的。最典型的是string类型,它重载了“=”这个操作,当你写“cache["dt"]=一个字符串变量;dt=["dt"];”的时候,它自动复制了一份字符串值到dt,因此你修改dt就不会影响到Cache中的数据。所以你在问题中举的ToString()这个恰好是跟大多数引用类型变量不同的。

即使是复制值的,服务器内存也不会增加多少,因为当你把新的值赋值到Cache中,旧的值过不了几秒钟就会被垃圾收集(GC)机制销毁了。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zyzl 的回复:]
当我修改过dt中的数据,还要再次使用Cache['dt']=dt语句,cache中的数据才会更新呢?
[/Quote]

不用,你更新dt,再取出的的Cache['dt']就是更新过的数据。
zyzl 2008-11-21
  • 打赏
  • 举报
回复
谢谢 ojekleen 。但,如果是引用的的话
DataTable dt=(DataTable)Cache['dt'];

当我修改过dt中的数据,还要再次使用Cache['dt']=dt语句,cache中的数据才会更新呢?
zyzl 2008-11-21
  • 打赏
  • 举报
回复
谢谢楼上兄弟,我的语句是有错误:应该是

Cache['dt']=dt1;
DataTable dt=(DataTable)Cache['dt'];

不小心写错了,可是要表达的意思是Cache的使用原理,还请您多指点?
lbh119 2008-11-21
  • 打赏
  • 举报
回复
应该这样
Cache['dt']=dt1;
DataTable dt=(DataTable)Cache['dt'];
  • 打赏
  • 举报
回复
Cache['dt']=dt1.ToString();
DataTable dt=(DataTable)Cache['dt'];

这两个根本就自相矛盾(类型转换错误),运行时会直接让你的程序崩溃。所以你后边说什么都没用,因为它根本没能跑起来。
ojekleen 2008-11-21
  • 打赏
  • 举报
回复
cache就像一个可以控制的静态object集合,当你把你的datatable insert cache的时候,其实就是把你的对象的引用给了cache,.net在垃圾回收的时候就不会回收你的datatable,下次调用的时候只要强制类型转换回你的datatable就可以使用,
DataTable dt=(DataTable)Cache['dt'];
而你的dt仍是一个指向你的原数据集的引用,并非new,用户点击多并不会增加服务器内存的使用
anheizhizi 2008-11-21
  • 打赏
  • 举报
回复
对于每个应用程序域均创建该类的一个实例,并且只要对应的应用程序域保持活动,该实例便保持有效。
gongsun 2008-11-21
  • 打赏
  • 举报
回复
顶吧....

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧