Java:我们可以将 DAO 用作 Singleton 实例吗

Posted

技术标签:

【中文标题】Java:我们可以将 DAO 用作 Singleton 实例吗【英文标题】:Java: Can we use DAO as a Singleton instance 【发布时间】:2012-09-16 18:56:36 【问题描述】:

这是一个一般性问题,并非针对我当前的应用程序。

在大流量多线程应用程序中,以下方法是什么:假设有一个 DAO,其中包含一个方法 updateData 来更新数据库内的一些数据。

问题:

    拥有该 DAO 类的 Singleton 实例并访问其方法 updateData 是一种好方法吗? 或者我是否应该每次都创建该 DAO 的新对象并调用方法 updateData

【问题讨论】:

【参考方案1】:

是的,为此类服务创建一个单例绝对是个好主意,确保它在被多个线程访问时没有任何与状态相关的问题

我会将此类 DAO 标记为 Spring bean

【讨论】:

非常感谢,在我们的例子中,我们的 DAO 类有状态(一个实例变量)所以我猜他们每次都在创建一个新的对象。 取决于,如果该实例可以与多个线程共享,那么就不需要那个(例如记录器),如果该成员变量与 DAO 的状态有关(通常不是这种情况) 那么你应该选择 2 DAO 可以具有成员变量,但这并不意味着它们具有“状态”。只需确保这些变量的值在 DAO 方法的调用之间不会改变,并且使用相同的输入参数调用一个方法两次返回相同的值。【参考方案2】:

最好创建一个 DAO 实例并将其传递给需要它的类的构造函数。我倾向于尽可能避免使用单例,因为除其他外,它们会使您的代码难以测试和隐藏依赖项。

看看这个问题的答案:What is so bad about Singletons?

【讨论】:

【参考方案3】:

您可以拥有 DAO 的单例实例,您只需确保 DAO 是无状态的,但 DAO 无论如何都应该是无状态的。

【讨论】:

以上是关于Java:我们可以将 DAO 用作 Singleton 实例吗的主要内容,如果未能解决你的问题,请参考以下文章

dao 作为 servlet 的成员 - 正常吗?

Spring Java 中许多 DAO 的策略

DAO 层可以返回一个 JDBC ResultSet (Java)

为啥我可以将 Web 服务用作 Java 应用程序,但不能使用 struts2

Java通过JDBC 进行Dao层的封装

我们可以直接在控制器中使用 DAO 而不是业务层对象吗?