为什么使用Singleton来管理数据库连接?

时间:2009-04-01 01:55:29

标签: database

我知道在此之前已经有人问过这个问题,但是我无法得到一个明确的解释,所以我会再次提出这个问题。那么使用单例来控制Web应用程序中的数据库连接有什么大惊小怪的呢?有些人喜欢它,有些人讨厌我不理解它。从我所读到的,“这是为了确保始终只有一个与您的数据库的活动连接”。我的意思是为什么这是一件好事?一个数据驱动的Web应用程序上的1个活动数据库连接处理每秒多个请求的麻烦不是吗?无论出于何种原因,没有人可以正确解释我一直在网上。我知道我很厚。

10 个答案:

答案 0 :(得分:4)

在这里假设Java,但也与大多数其他技术相关。

我不确定你是否混淆普通单身人士与service locator的使用。它们都是设计模式。应用程序使用服务定位器模式来确保有一个类负责获取和提供对数据库,文件,JMS队列等的访问。

大多数服务定位器都是作为单例实现的,因为不需要多个服务定位器来完成相同的工作。此外,缓存从第一次查找获得的信息非常有用,该信息稍后可供服务定位器的其他客户端使用。

顺便说一句,关于

的论点
  

“这是为了确保永远存在   只有一个活动连接到您的数据库“

是虚假和误导。如果在很长一段时间内保持不活动状态,很可能会关闭/回收连接。因此,不赞成缓存与数据库的连接。这个论点有一个偏差;只要您使用相同的上下文,即在同一HTTP请求或用户请求(以适用者为准)内,就会鼓励“重新使用”从连接池获得的连接。从性能的角度来看,这显然是很有效的,因为建立新的连接可以证明是一项昂贵的操作。

答案 1 :(得分:1)

高性能(甚至中等性能)Web应用程序使用数据库connection pooling,因此可以在许多Web请求之间共享一个数据库连接。单例通常是管理此池的对象。我认为使用单例的动机是对维护程序员进行愚蠢的证明,否则可能会不必要地实例化许多这些对象。

答案 2 :(得分:1)

“确保始终只有一个活动连接到您的数据库。”我认为可以更好地说明确保每个CLIENT只有一个与您的数据库的活动连接。这非常重要的原因是因为你想要防止死锁。如果我有两个打开的数据库连接(作为客户端),我可能会在一个连接上更新,然后我可能会尝试更新另一个连接中的同一行。这将是数据库无法检测到的死锁。因此,单例的想法基本上是为了确保有一个对象负责向每个客户端分发数据库连接。基本上。你没有必要有一个单身人士,但是大多数人会告诉你,系统只有一个是有意义的。

答案 3 :(得分:0)

你是对的 - 通常这不是你想要的。

但是,在很多情况下,您需要将自己限制在一个连接中。通过单一序列化对数据库的访问,您可以解决其他问题或约束,如负载,带宽等。

我在过去为批量处理应用做了类似的事情。相反,我使用信号量来同步对数据库的访问,因此我可以允许n个并发数据库操作。

答案 4 :(得分:0)

由于数据库服务器的限制,人们可能希望使用单例,例如,服务器可能会限制连接数。

我的主要意识是你知道哪些连接可以被管理/关闭等等,只是当你没有不必要的冗余连接时,让事情变得更有条理。

答案 5 :(得分:0)

我认为这不是一个简单的答案。例如,在ASP.NET上,该平台默认实现连接池,因此它将自动调整连接的“池”并重新使用它们,这样您就不会不断创建和销毁昂贵的对象。

但是,假设您正在编写一个监控200个独立输入源的数据收集应用程序。每次更改其中一个输入时,都会触发将事件记录到数据库的线程。我想如果有可能在同一时间内有一小部分可以发射,那么这可能是一个糟糕的设计。突然有20或40个活动数据库连接是低效的。对更新进行排队可能更好,只要队列中还有更新,单个连接就会从队列中选择它们并在服务器上执行它们。它更有效,因为您只需要协商连接和身份验证一次。一旦没有活动,您可以选择关闭连接。如果没有像单身人士这样的中央资源管理器,这种行为很难实现。

答案 6 :(得分:0)

“只有一个活动连接”是一个非常狭窄的说明。它也可以是管理连接池的单身人士。数据库连接的单例的关键是你不希望每个消费者都建立自己的连接或连接集。

答案 7 :(得分:0)

我想你可能想要更具体一点,“使用单例来控制你的网络应用程序中的数据库连接。”理想情况下,java.sql.Connection对象是线程安全的,但是您的javax.sql.DataSource可能希望池连接,因此您应该转到它的单个实例来共享池。

答案 8 :(得分:0)

您需要为每个请求寻找一个连接,而不是整个应用程序的一个连接。你仍然可以通过单例来控制对它的访问(将连接存储在HttpContext.Items集合中)。

答案 9 :(得分:-4)

它保证使用您站点的每个客户端只获得一个与db的连接。 每次用户执行将创建数据库查询的操作时,您实际上不希望建立新连接。不仅出于性能原因而涉及连接握手,还要减少数据库服务器上的负载。

数据库连接是一种宝贵的商品,这种技术有助于最大限度地减少在任何给定时间使用的数量。