none
数据库连接类采用单例模式 RRS feed

  • 问题

  •  private static readonly object obj = new object();
            public static MssqlDbHelp mssqlDbHelp = null;
            public static MssqlDbHelp GetMssqlDbHelp
            {
                get
                {
                    if (mssqlDbHelp == null)
                    {
                        lock (obj)
                        {
                            if (mssqlDbHelp == null)
                            {
                                mssqlDbHelp = new MssqlDbHelp();
                            }
                        }
                    }
                    return mssqlDbHelp;
                }
            }

    我是采用这种单例模式来做我的数据访问类,如果这样写的坏处是什么啊!


    @过&客@
    2010年10月20日 8:29

答案

  • 这个还不够单例,类还是可以实例化,最好的是加上 private MssqlDbHelp() 私有构造

     

    单例用户使用的话,就是这些判断带来的开销,可以使用静态初始化来做,就不需要过多的判断

    public sealed Singleton {

    static   readonly  Singleton instance = new  Singleton();

     

    static Singleton(){}

     

    public static Singleton GetInstance

    {

      get { return instance;}

    }

    }

    • 已建议为答案 gsralex 2010年10月31日 0:39
    • 已标记为答案 Mog Liang 2010年11月8日 2:45
    2010年10月20日 12:59
  • 坏处就是在并发时,可能导致一些不可预料的结果

    所以很多类在msdn上有一句话:

    此类型的任何公共 static(在 Visual Basic中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

    当然,看你是怎么实现了

    • 已标记为答案 Mog Liang 2010年11月8日 2:45
    2010年11月2日 12:52

全部回复

  • 这个还不够单例,类还是可以实例化,最好的是加上 private MssqlDbHelp() 私有构造

     

    单例用户使用的话,就是这些判断带来的开销,可以使用静态初始化来做,就不需要过多的判断

    public sealed Singleton {

    static   readonly  Singleton instance = new  Singleton();

     

    static Singleton(){}

     

    public static Singleton GetInstance

    {

      get { return instance;}

    }

    }

    • 已建议为答案 gsralex 2010年10月31日 0:39
    • 已标记为答案 Mog Liang 2010年11月8日 2:45
    2010年10月20日 12:59
  • 那我的这个类始终没有被销毁啊 除非是程序停下来啊
    @过&客@
    2010年10月21日 2:30
  • 为什么要销毁?销毁是因为泄漏等问题,或者需要关闭一些连接,才需要手动销毁

     

    这个类一直在使用

    2010年10月21日 6:14
  • 坏处就是在并发时,可能导致一些不可预料的结果

    所以很多类在msdn上有一句话:

    此类型的任何公共 static(在 Visual Basic中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

    当然,看你是怎么实现了

    • 已标记为答案 Mog Liang 2010年11月8日 2:45
    2010年11月2日 12:52