DAO和连接

3
我应该在哪里打开和关闭仓库的连接?在文章 "不要重复DAO" 中写道:

DAO 不负责处理事务、会话或连接。这些是在 DAO 之外处理的,以实现灵活性。

但有些人建议我将 @Resource DataSource 对象注入到 DAO 类中,并在 DAO 方法内处理所有连接...即每个 CRUD 操作都应该打开和关闭与仓库的连接。

1
我们不在DAO内部管理连接,因为您可以使用相同的打开连接获取实体来获取多个DAO。 - Buhake Sindi
3个回答

6

请参考本文的建议:

最好让你的应用程序容器管理资源和连接池。如果你的连接已经配置了事务管理,则容器将能够管理你的事务(因此不需要打开连接并进行提交)。

如果你自己管理连接和事务,请先打开连接,启用事务并将已打开的连接传递给DAO,在提交事务之后关闭连接(在DAO之外)。

一旦你的服务完成了所有DAO的工作,就可以关闭连接。

希望这能帮到你。


是的,我自己管理事务和连接。 首先打开连接,启用事务并将打开的连接传递给DAO - 我可以在服务层中做这件事吗?还是我需要创建一些包装类来隐藏所有底层机制(打开连接,事务)并在服务层内使用这些包装类?另外,我使用Java EE5,那么我可以为DAO使用EJB吗? - WelcomeTo
回答你的问题:是的! - Buhake Sindi

1

我个人使用Spring来管理数据源。

在您的应用程序上下文XML中配置数据源bean。将其自动装配到DAO,然后使用Spring处理DAO类上的@Transactional注释来处理事务。

您还需要在应用程序上下文中添加<tx:annotation-driven/>

如果您正在使用Hibernate,则可以通过在应用程序上下文中配置SessionFactory来实现相同的功能。


抱歉,我不使用Spring和Hibernate。 - WelcomeTo
DAO不应该负责处理连接,但它依赖于它们。如果您不使用Spring或Hibernate,则必须在业务逻辑层中处理这些连接以进行事务处理。从数据源获取一个连接后,业务层组件将把它传递给您的DAO。实际上,Spring已经提供了一些方便的XXXDAOSupport类,它与数据源非常配合。 - Gavin Xiong
@GavinXiong 谢谢,看了你的评论后我对这个过程更清楚了。还有第二个问题(可能不是主题):使用EJB作为DAO对象怎么样?然后在另一个EJB中重用这个DAO(实际上是EJB)。 - WelcomeTo

0

我同意你可以使用Spring来管理事务,但同时请记住,管理事务不是DAO的职责。它们应该在你的服务层中处理,这个层面负责管理业务逻辑。


我应该在服务层内处理连接(也包括事务)吗?即服务层将打开连接,然后打开事务,使用DAO对象进行一些业务逻辑,提交事务并关闭连接?这是正确的吗? - WelcomeTo
不,数据库连接只会在DAO层处理。只有事务会由服务层处理。 - Prateek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接