单例,数据表,缓存的问题

我看你有戏 2010-01-03 03:16:47
我用了一个单例模型管理了一些缓存数据

单例就是new 一个类,保证web服务器内存中只有一个实例

用了两种办法缓存数据

方法一:

public DataTable GetMoveTable()
{
DataTable dt = System.Web.HttpContext.Current.Cache["tb_movies_list"] as DataTable;
if(dt==null)
{
//这里就去数据库读取DataTable,并缓存
}
return dt;
}


方法二:

private DataTable m_dt;
public DataTable GetMoveTable()
{
DataTable dt = m_dt;
if(dt==null)
{
//这里就去数据库读取DataTable,
m_dt = dt;
}
return m_dt;
}


试问:两种办法有何异同

...全文
149 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
我看你有戏 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 eternityzhu 的回复:]
其实2种都不好。

1.缓存其实是很少的。如果你要保存很多东西,不要用Cache。

2.应该写成 private static DataTable m_dt;。但问题也很明显,静态变量也是用堆栈的,空间也不是很多,如果数据大也不建议这样用。而且最重要问题是,静态变量是永远存在的,你不知道什么时候更新数据,所以如果真的要使用,应该加个看门狗之类的程序定时去检查数据有没有更新,有的话就清空。

个人建议,如果数据量大应该用memcache;数据量少,可以用static 。

[/Quote]

看来这位兄台对单例还不是很了解

建议先看下
eternityzhu 2010-01-04
  • 打赏
  • 举报
回复
其实2种都不好。

1.缓存其实是很少的。如果你要保存很多东西,不要用Cache。

2.应该写成 private static DataTable m_dt;。但问题也很明显,静态变量也是用堆栈的,空间也不是很多,如果数据大也不建议这样用。而且最重要问题是,静态变量是永远存在的,你不知道什么时候更新数据,所以如果真的要使用,应该加个看门狗之类的程序定时去检查数据有没有更新,有的话就清空。

个人建议,如果数据量大应该用memcache;数据量少,可以用static 。
我看你有戏 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mbh0210 的回复:]
从你写的两个来看,相对来说第一种比较好。

你写的第二种不能说是单例模型,即使你说“这个类能且只能被new一个实例的”。

在单例模型中增加lock锁,处理并发。将第二种修改下使用第二种比较好.
[/Quote]


到底是哪个好啊,一会儿时第一种,一会儿又是第二种

mbh0210 2010-01-04
  • 打赏
  • 举报
回复
从你写的两个来看,相对来说第一种比较好。

你写的第二种不能说是单例模型,即使你说“这个类能且只能被new一个实例的”。

在单例模型中增加lock锁,处理并发。将第二种修改下使用第二种比较好.
我看你有戏 2010-01-04
  • 打赏
  • 举报
回复

就是不知道在并发的情况下效果哪个更好一些
cuike519 2010-01-04
  • 打赏
  • 举报
回复
貌似一个用的是局部变量,一个用的是全局变量,就这点差别啊。

还有别的么?逻辑是一样一样的啊。

并发问题?什么并发问题?两个都是实例有什么并发问题?如果说的是Cache,在MSDN里面有句话:This type is thread safe.
我看你有戏 2010-01-04
  • 打赏
  • 举报
回复
double check
我看你有戏 2010-01-04
  • 打赏
  • 举报
回复

//这是微软提供的单例代码

using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}



jshi123 2010-01-03
  • 打赏
  • 举报
回复
我看你有戏 2010-01-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jshi123 的回复:]
1. 在cache中的内容不保证始终有效,在内存紧张等情况下系统会自动释放cache中的内容
2. 第二种方法称不上是单例模式,因为m_dt是实例变量,每一个类实例都有一份m_dt,把它改成static

[/Quote]

第二种方法,我是定义了这么一个类,这个类能且只能被new一个实例的
jshi123 2010-01-03
  • 打赏
  • 举报
回复
1. 在cache中的内容不保证始终有效,在内存紧张等情况下系统会自动释放cache中的内容
2. 第二种方法称不上是单例模式,因为m_dt是实例变量,每一个类实例都有一份m_dt,把它改成static
我看你有戏 2010-01-03
  • 打赏
  • 举报
回复
我就是不知道网站流量大了以后会是怎样的状态

一般是缓存20000条数据的,网站进程总该大概80M左右
lvfeng19806001 2010-01-03
  • 打赏
  • 举报
回复
帮顶!
期待答案!
小_虎 2010-01-03
  • 打赏
  • 举报
回复
很好,不知道有什么区别
TengDong2008 2010-01-03
  • 打赏
  • 举报
回复
单例模式有两种:

一种是饿
一种是懒

62,047

社区成员

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

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

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

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