大家进来讨论一下单例模式与数据库操作类

时间:2022-12-11 12:00:00
我在单例模式中创建数据库操作对象来实现了sqlhelper

单例模式类中:

public IDataAccess Db(IDataAccessConfig IDAConfig)
{
    return DataAccessFactory.CreateDataAccess(IDAConfig);
}

我做过一个多线程调用sqlhelper读取指定表的测试。通过单例模式创建数据库操作对象和跨过单例模式直接创建数据库操作对象在性能上没有看到很大的变化!我在网上看资料,有的人说,单例模式会造成排队等待现象,但通过多线程操作来看,并没有发生这样的情况。我目前对单例模式的理解,仅为全局接入点,唯一实例!不知道是否还有其它妙处所在?


例如:网上资料中说道,单例模式应用场景中有提到:log,但如果多线程通过单例模式,仍然可以同时操作txt文档!我所理解的是,通过单例模式也只是实例化对象唯一罢了!不知道我这么理解是否有问题!请大家讨论一下

10 个解决方案

#1


意义不大吧,主要是重用性提高了,其他都是浮云吧.
可能偶太水看不出来有什么大变化吧.

#2


sqlConnection是专门设计来使用连接池的,不需要这样设计

#3


恩。那么如果这里使用了单例模式,是否会对性能造成影响呢?从我测试来看。目前没有发现。不知道我的测试方法是否妥当。我开启两个线程,同时每隔1秒通过单例模式创建的数据库操作对象访问数据库某个表以及不通过单例模式。但没有发现哪里出现问题!那么这里就是想讨论一下。单例模式真正用意在哪里?难道只是为了全局唯一实例化对象吗?

#4


使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来,如果一个类可以有几个实例共存,就不要使用单例模式。

注意:1)不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中;2)不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放,带来问题。

#5


使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来,如果一个类可以有几个实例共存,就不要使用单例模式。

注意:1)不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中;2)不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放,带来问题。

#6


是的。我就是用两个线程模拟了多个连接。目前发现在单例和不在单例下的效果没有发生问题!所以很困惑!本想应该存在差异。尤其在性能上。

#7


sqlConnection 如果做成单例的,或者静态的,那么一定会照成排队的现象。

如果是在函数内部new的话,那么我也不能确定。

#8


的确,sqlconnection我是在数据操作基类中new的。并不是单单把sqlconnection做在了单例中!你能够确定单例模式可以起到排队现象吗?你做过类似的实验吗?但从单例定义上看。只是对该类的唯一实例化。并没有牵扯到前后排队的问题。

所谓lock处,也只是判断当前类是否已经初始化了实例对象!并不是lock排队等待!

#9


该回复于2011-01-24 17:31:29被版主删除

#10


顶上去,望大家继续讨论!

#1


意义不大吧,主要是重用性提高了,其他都是浮云吧.
可能偶太水看不出来有什么大变化吧.

#2


sqlConnection是专门设计来使用连接池的,不需要这样设计

#3


恩。那么如果这里使用了单例模式,是否会对性能造成影响呢?从我测试来看。目前没有发现。不知道我的测试方法是否妥当。我开启两个线程,同时每隔1秒通过单例模式创建的数据库操作对象访问数据库某个表以及不通过单例模式。但没有发现哪里出现问题!那么这里就是想讨论一下。单例模式真正用意在哪里?难道只是为了全局唯一实例化对象吗?

#4


使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来,如果一个类可以有几个实例共存,就不要使用单例模式。

注意:1)不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中;2)不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放,带来问题。

#5


使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来,如果一个类可以有几个实例共存,就不要使用单例模式。

注意:1)不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中;2)不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放,带来问题。

#6


是的。我就是用两个线程模拟了多个连接。目前发现在单例和不在单例下的效果没有发生问题!所以很困惑!本想应该存在差异。尤其在性能上。

#7


sqlConnection 如果做成单例的,或者静态的,那么一定会照成排队的现象。

如果是在函数内部new的话,那么我也不能确定。

#8


的确,sqlconnection我是在数据操作基类中new的。并不是单单把sqlconnection做在了单例中!你能够确定单例模式可以起到排队现象吗?你做过类似的实验吗?但从单例定义上看。只是对该类的唯一实例化。并没有牵扯到前后排队的问题。

所谓lock处,也只是判断当前类是否已经初始化了实例对象!并不是lock排队等待!

#9


该回复于2011-01-24 17:31:29被版主删除

#10


顶上去,望大家继续讨论!