【问题标题】:DAO. JDBC. Where to place Connection object?道。 JDBC。在哪里放置 Connection 对象?
【发布时间】:2012-12-27 08:51:57
【问题描述】:

在DAO设计模式中Connection对象必须放在哪里?

我是否需要使用open()close() 两种方法创建单独的类(例如DaoManager)?并且在业务逻辑中确实喜欢:

DaoManager.open();
PersonDao personDao = DaoFactory.getPersonDao();
Person person = personDao.getById(personId);
.... //more DAO operations
DaoManager.close()

【问题讨论】:

    标签: java design-patterns jdbc dao


    【解决方案1】:

    连接应该是PersonDao.getById() 方法(和其他DAO 方法)的局部变量。它应该从 DataSource 获取连接,使用它,然后在 finally 块中关闭它。

    如果您多介绍一下您的环境(Spring、EJB 容器?),我可以给出更多解释。

    【讨论】:

    • 谢谢。我使用 WAS 7(EJB 容器)。我知道如何在 WAS 中处理 DataSource..但实际上我不使用 JDBC,我使用另一个具有自定义存储库的框架。它还有 Connection 对象等。所以我想尽可能保持我的代码抽象,以便轻松更改内部实现以使用 JDBC/JPA。
    • 好吧,那我们怎么回答呢?我们对这个其他框架一无所知。
    • 那么在DataSource的情况下,我的DAO类应该怎么看(我认为我的实现中的框架也使用DataSource,所以代码应该是一样的)?我需要有 DAOFactory,并且在 DAOFactory 的构造函数中我需要放置 Connection 对象?并且 DAOFactory 将初始化PersonDAO 放入构造函数 Connection 实例变量 (getPersonDao(mConnection))?
    • 没有。 DAO 应该有一个 DataSource 类型的字段,并且 DAO 的每个方法都应该从 DataSource 字段中获取一个连接,使用它,并在 finally 块中关闭它。 WAS 7 支持哪个版本的 JEE 规范?如果是 JEE 6,您的 DAO 应该是注入到服务 EJB 中的 CDI bean。如果是 JEE5,您的 DAO 应该是注入到服务 EJB 中的 EJB。你不应该需要任何 DAOFactory。
    • 这无关紧要,因为它们应该是线程安全且无状态的(DataSource 引用除外)。我将它们设为单例,但现在 Java 中的对象很便宜。
    【解决方案2】:

    在大型应用程序中,您通常会将连接保存在连接池中,以便可以将它们重用于多种用途。这样做是因为打开一个新的数据库连接可能有点贵。

    DAO 获取对池的引用,并在需要时取出连接。手术结束后,它会将其放回池中。

    有几种可用的连接池的开源实现,您可能希望重用其中之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-10
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      相关资源
      最近更新 更多