我把所有对数据库的操作都按照表写成了若干类
请问一下能否在Web项目中把这些类改为单件模式来使用?
会不会由于多线程的访问而带来不安定的因素?能避免么?
其实关键是想了解一下这样能不能提高性能,每次New一个操作类应该很耗资源吧。

解决方案 »

  1.   

    单件模式属于设计模式,在任何程序的设计中都可以用啊
    你说的这个问题现在一般都是通过静态方法来实现的
    比如
    public class DataAccess
    {
    public static DatsSet GetUserByUserID(string userID)
    {
       //这里打开数据库连接,取得数据
       ....
       return ds;
    }
    }调用的话都是这样写
    DataSet ds = DataAccess.GetUserByUserID(UserID);当然,你也可以把传递的DataSet换成你自己构造的对象
      

  2.   

    不知道你的web程序是不是有特殊的情况才会考虑这种情况。我这里做的时候是不会考虑这样的,如果你怕插到表中有相同数据的话,可以进行锁表操作。
      

  3.   

    我的每个操作类都比较大,但是通常new一次后只使用其中的一个方法,而一次postback后通常要new多个类,所以我在考虑是不是new太消耗资源了另外说一下,需要峰值400人同时访问
      

  4.   

    还有,如果使用单件模式,是不是每个section都将使用同一个new出来的类来操作阿?能不能减少系统消耗阿?
      

  5.   

    自己用codesmith写的脚本生成的,方便是方便,但是现在的情况是性能不行啊。
      

  6.   

    单件模式应该不可以得,会产生线程问题。创建一个类,主要是field占用空间,其初始化占用时间,与方法的多少关系不是太大。
      

  7.   

    我的操作类里只有方法没有变量和属性,估计并发的时候不会有太大影响,不知道会不会影响方法内部的变量?new一个类时候真呢那么省事么?单个用户还好吧,问题是每天早上上班的时候会有400人同时提交,这时候new 400次估计会有些影响,如果400个人都用得是同一个事例不知道能不能提高性能?
      

  8.   

    数据库访问层我使用的是Enterprise Library
      

  9.   

    和楼主有同感有同样的担心,大概还是我对这个东西不太了解的原因吧!举个列子讲:例如:
    一个用户 通过Web访问 触发一个静态方法 对数据库表一进行取数,但当数据还未取完时,第二个用户,也通过Web访问 触发这个静态方法 对数据库表二进行取数据,大家知道,静态方法是属于类本身的,相当于是公共的,如果这样取数据的法,是不是会有影响呢?
      

  10.   

    “单件”.....呵呵,但到这些我有点神经质想发笑。在.net中你直截了当地说 static变量 就可以了,请不要那么高深。
      

  11.   

    学习中... 欢迎加入ASP.NET(C#)学习交流QQ群号:32801051
      

  12.   

    回复人:sp1234(修改成功!请关闭本页。) ( 三星(高级)) 信誉:100  2007-02-09 13:04:52  得分:0

    “单件”.....呵呵,但到这些我有点神经质想发笑。在.net中你直截了当地说 static变量 就可以了,请不要那么高深。
    --------------------------------谁告诉你的??? 回复人:sp1234(修改成功!请关闭本页。) ( 三星(高级)) 信誉:100  2007-02-09 13:07:35  得分:0

    Q: 静态类中的方法内部的变量是不是会在多用户访问的时候产生问题啊?
    ————————————————————————————————————————————
    A: 当然。====================================谁告诉你的???
      

  13.   

    我可以写单件的单件的单件的单件,这纯粹是玩弄成事不足的编码手段。java没有static语法,所以在那里说单件这种概念很平常。但是不必在.net里死抠字眼,不必说static因为和java的语法不一样就不是单件。煞有介事地说static不是单件的更合理实现,太迂腐了。
      

  14.   

    我们把java那里的某些腐尸气扬弃了吧。“我可以写单件的单件的单件的单件,这纯粹是玩弄成事不足的编码手段”,我的意思是说如果搞个代理函数,然后给这个代理函数再搞个代理函数....,仍然是返回那个static变量。当然这里我直接用.net的static静态变量,来说穿单件语法在.net中的迂腐形式没有必要。
      

  15.   

    static private _inst;static public 类型 GetInstance()
    {
      if(_inst==null)
        创建_inst实例;
      return _inst;
    }
    然后访问者调用每一个对象的内容,而实际上这些对象其实是指向同一个实例的。故弄玄虚的风格其实设计模式中很多问题的根源。在.net中,当然也可以这样故弄玄虚。不过直接了当的方式是清楚地直接访问类型中的内容,而不是对象中的内容。当我们访问一个共享的值得时候,就直接访问类型中共享的值,而不是通过保证任何新对象都指向同一个隐含的对象(这简直是语言的垃圾,设计模式喜欢尽量实现复杂的语言垃圾)来曲折地实现。类型中的内容(不论是属性、值域还是方法等)通过static关键字说明一下就通知编译器从实例中移到类型中了。java没有这个语法。
      

  16.   

    照你的说法property的设计也没有用了???还有,如果你要设计laze的singleton,你还就得写成这种你认为迂腐的方式。
    下面这段代码,摘自微软网站
    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; 
          } 
       } 
      

  17.   

    我估计也是这样的,要是方法内的的变量都被影响了的话,那.net太不可靠了。
      

  18.   

    我也有疑问,向flyforlove(为情飞)请教______________________________________________如果你必须实例化一个类,不管是不是单件
    你一定是需要保存某些字段值,否则完全可以用静态类
    但是单例的字段与静态字段有区别吗?
    请举例说明单例的实际应用(不可用静态实现的)
    ______________________________________________
      

  19.   

    回复人:viena(维也纳nn) ( 三星(高级)) 信誉:100  2007-02-09 16:07:48  得分:0

    我也有疑问,向flyforlove(为情飞)请教______________________________________________如果你必须实例化一个类,不管是不是单件
    你一定是需要保存某些字段值,否则完全可以用静态类
    但是单例的字段与静态字段有区别吗?
    请举例说明单例的实际应用(不可用静态实现的)
    ______________________________________________------------------------------------------------------------什么时候使用静态类,我和你的观点没有异议。
    我上面的回帖也说了这一点。另外我也没有说一定要把singleton和static对立起来。
    singleton的实现是要靠static field来实现,但是你不能说singleton就等同于static。你看看sp1234给的例子,看来他很讨厌这样的写法static private _inst;static public 类型 GetInstance()
    {
    if(_inst==null)
    创建_inst实例;
    return _inst;
    }我想他喜欢的风格应该是这样的吧static class SingletonCls
    {
       public  static  类型 Instance = new 类型();
    }但是我也说了,如果要实现laze singleton的话,还是要用以下的风格吧
    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;
    }
    }
    }至于什么时候用laze singleton,我想很简单吧,laze之所以是laze,是因为只用在需要的时候才创建。
      

  20.   

    回复人:viena(维也纳nn) ( 三星(高级)) 信誉:100  2007-02-09 16:10:48  得分:0

    另声明一下,我赞同sp1234的观点-------------------------我不知道你赞同他那些观点,以下的观点你赞同么???========================================= 回复人:sp1234(修改成功!请关闭本页。) ( 三星(高级)) 信誉:100  2007-02-09 13:07:35  得分:0

    Q: 静态类中的方法内部的变量是不是会在多用户访问的时候产生问题啊?
    ————————————————————————————————————————————
    A: 当然。
      

  21.   

    我的意思是单例与静态类在使用上并没有区别
    为什么不直接用静态类?而非要麻烦的返回一个单例?
    静态类的字段同样可以保存单独一份的值,与单例对象的字段有区别吗?
    至于方法,本来就是与实例无关的
    我想知道有什么必要用单例?在什么情况下用?
    //laze之所以是laze,是因为只用在需要的时候才创建。
    你用静态类,根本就不用创建什么,直接拿来用,不是更好吗~
      

  22.   

    viena(维也纳nn) ( ) 信誉:100    Blog  2007-2-9 18:34:10  得分: 0  
     
     
       
    静态类的字段的初始化可以放在静态构造函数中,
    也是在第一次使用时才调用,
    与你在需要的时候才显式地创建一个单例对象似乎没有区别  
     
    ----------------------------------------------
    可能我们之间的互相理解的有些偏差。
    如果只是一组静态方法,我想确实没有必要使用返回实例的方法。至于你说的先实例化还是后实例化的问题,其实java中也有两种用法。
    至于什么时候用lazy singleton,网上有争论。
    ---------------------------- asurasa70(暴风) ( ) 信誉:100    Blog  2007-2-10 11:37:56  得分: 0  
     
     
       
    回到上一个问题,
    静态类中的方法内部的变量是不是会在多用户访问的时候产生问题啊?
    几位仁兄回答的有点模糊阿,如果在没有静态变量在静态类中的话,线程是安全的么?  
    ------------------------------------
    我的观点,只要静态方法没有操作类中的静态变量,线程就是安全的。
    说到底线程安不安全,主要是对数据的,不是对方法。
    只要数据不冲突,方法有什么不安全的。