【问题标题】:Spring, Hibernate: DAO-Class: Using always the same object?Spring,Hibernate:DAO-Class:总是使用同一个对象?
【发布时间】:2011-03-21 14:56:21
【问题描述】:

我正在使用 Spring 3 和 Hibernate 3.6 开发 Web 应用程序。

我有一个 DAO 类,并在 xml 文件中为它创建了一个 bean(名为“dao1”)。每个需要访问数据库的类都会注入这个实例。它总是相同的 dao-object (scope=singleton)

现在我想知道这是否是使用 DAO 的推荐方式。在其他类中总是注入不同的实例会更好吗?如果是,为什么? 将 DAO 拆分为不同的类会更好吗?总是包含一些 dao 方法,可能特定于一张表?

使用我提到的结构有什么缺点吗?

谢谢! :-)

【问题讨论】:

    标签: hibernate spring singleton dao


    【解决方案1】:

    使用 Hibernate / JPA,dao 需要一个新的会话/实体管理器。但是spring通过注入一个每次都定位新会话的代理来处理这个问题。所以拥有singleton DAO 是正确的方法。

    澄清一下——如果你的 DAO 除了注入的依赖项之外没有任何状态(即没有实例字段),那么它可以安全地是单例的。否则 - 不是。

    【讨论】:

    • 我相信这一点,但在春季论坛我找到了另一个答案,所以我不确定了(?):forum.springsource.org/…
    • 那里的答案和我的一样——如果你不在 dao 中保留任何状态,它可以是单例的。唯一有状态的东西是实体管理器,但是 spring 负责它。
    【解决方案2】:

    作为经验法则,在进行注射时要问问自己。

    这个组件/bean/对象中是否有任何状态?

    如果每次调用或其他任何情况都必须处理状态,则需要更改范围或生命周期。如果不是,那么您应该将其配置为单例。

    通常在 DAO 类中,没有状态。或者不应该。状态应该在持久化目标(数据库)中。

    因此,可以肯定地说,在这种情况下,您完全可以将其配置为 Singleton。

    【讨论】:

    • daos 通常至少需要一个连接,对于不同的用户来说是不同的,所以它是某种状态
    • Connections [to a database] 通常对于所有用户都是相同的。至少在网络应用程序中。
    • 抱歉,“用户”是指“线程”。通常每个线程都有不同的连接。
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2014-05-02
    相关资源
    最近更新 更多