单身如何用于管理数据库连接?

时间:2011-04-07 03:50:38

标签: java database design-patterns database-design singleton

这可能是一个非常古老的问题。但我无法找到合适的答案,所以再问一遍。

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

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

感谢。

4 个答案:

答案 0 :(得分:5)

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

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

顺便说一句,关于

的论点

“确保始终只有一个与您的数据库的活动连接”

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

即使您没有提及会话/交易/ ORM,我认为您的问题来自Hibernate,JPA或其他ORM背景。

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

现在通过使用工厂模式,我们可以获得尽可能多的类似对象......但工厂本身应该是单例。因此在DB操作中,entityManagerFactory或sessionFactory对象保持为单例。

当你考虑它时,它是有道理的,因为毕竟sessionFactory代表一个配置(DB,UserID,密码,连接池大小,缓存等)。执行数据库事务所需的不是工厂,而是工厂创建的对象(会话)。这些你可以拥有任意多个。但是如果你有多个工厂,那就是不必要地创建相同(相似)的对象。

我们在普通的jdbc以及ORM中使用连接池。

答案 3 :(得分:1)

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

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

这样,只要能够同时创建数百万个线程,您的应用程序就可以使用单例同时创建数百万个连接。