Java 如何使用singleton管理数据库连接?

Java 如何使用singleton管理数据库连接?,java,database,design-patterns,database-design,singleton,Java,Database,Design Patterns,Database Design,Singleton,这可能是一个非常古老的、多次被问到的问题。但是我找不到一个合适的答案,所以再次询问 对于数据库连接,我们总是使用单例对象。当成千上万的用户访问数据库时,如何保持性能?我的意思是,如果每秒有数千个请求,那么既然我们使用的是单例,那么如何管理数据库连接呢?数据库请求是否序列化?或者在这些情况下不使用单例 我知道这是一个愚蠢的问题,但我很困惑。如果有人能提供一些参考阅读链接,那就太好了 谢谢。我不确定您是否混淆了普通单例和服务定位器的使用。它们都是设计模式。应用程序使用服务定位器模式来确保只有一个类负

这可能是一个非常古老的、多次被问到的问题。但是我找不到一个合适的答案,所以再次询问

对于数据库连接,我们总是使用单例对象。当成千上万的用户访问数据库时,如何保持性能?我的意思是,如果每秒有数千个请求,那么既然我们使用的是单例,那么如何管理数据库连接呢?数据库请求是否序列化?或者在这些情况下不使用单例

我知道这是一个愚蠢的问题,但我很困惑。如果有人能提供一些参考阅读链接,那就太好了


谢谢。

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

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

顺便说一下,关于

“这是为了确保始终只有一个活动的DB连接”


这是错误的和误导性的。如果长时间处于非活动状态,很可能会关闭/恢复连接。因此,缓存到数据库的连接是不可取的。这一论点有一个偏差;鼓励“重用”从连接池获得的连接,只要您在相同的上下文中这样做,即在相同的HTTP请求或用户请求中(以适用的为准)。从性能的角度来看,这显然是可以做到的,因为建立新连接可能是一项昂贵的操作。

我建议使用连接池
http://www.java2s.com/Code/Java/Database-SQL-JDBC/PooledConnectionExample.htm

即使您还没有发布任何关于会话/事务/ORM的内容,我认为您的问题来自Hibernate、JPA或其他ORM背景

因此,对于任何要发生的事务,我们都需要一个entityManager或会话。可以为每个事务创建这些会话

现在通过使用工厂模式,我们可以得到我们想要的任意多的相似对象。。。但工厂本身应该是单体的。因此,在DB操作中,entityManagerFactory或sessionFactory对象保持为单例

仔细想想,它是有意义的,因为毕竟sessionFactory代表一种配置(DB、UserID、密码、连接池大小、缓存等)。您需要执行DB事务的不是工厂,而是工厂创建的对象(会话)。你想要多少就有多少。但是,如果您有多个工厂,则不必创建相同(类似)的对象


我们在普通jdbc和ORM中使用连接池。

如果创建单例的数据库连接是无状态的(应该是无状态的,或者至少应该是不可变的),那么它非常简单

当数千个用户同时访问web应用程序时,实际上有数千个线程,每个用户一个。每个线程都有自己的程序计数器,它跟踪当前正在处理的指令线程。当线程访问单例的公共方法时,例如
myDBConnectionManager.getConnection()
,它将开始执行其中指定的指令。因此,实际上是一个线程通过读取
myDBConnectionManager.getConnection()
方法中指定的指令来创建数据库连接。singleton的方法只是指导线程做什么的手册


通过这种方式,您的应用程序可以使用单个对象同时创建数百万个连接,只要它能够同时创建数百万个线程。

为什么以及谁说
对于数据库连接,我们总是使用单个对象
,真正的问题是什么?尝试说明您试图解决的问题?相关: